PHP: sunucuları bir yürütme zaman limiti koymak zaman uzun çalışan komut dosyalarını Kodlama

4 Cevap php

FastCGI sunucular, örneğin, PHP set_time_limit() kullanılarak değiştirilemez PHP üzerinde bir yürütme zaman limiti koymak. IIS bunu yapar da ben inanıyorum.

Ben mod_php altında iyi çalışıyor ama komut saniye belli bir sayıdan sonra öldürüldü çünkü FastCGI (mod_fcgid) altında başarısız bir PHP uygulaması için bir ithalat senaryo yazdı. Ben henüz zaman sınırı bu durumda ne tespit bir yol bilmiyorum ve ben etrafında almak için gidiyorum nasıl karar vermedim. Yönlendirmeler ile küçük parçalar halinde bunu yaparken bir kludge, ama ne gibi görünüyor?

Böyle bir birey PHP komut dosyası saniye belli bir sayıdan sonra sunucu tarafından sona erdirilebilir bir ithalat veya ihracat görev olarak uzun süren bir görev kodlama yaparken hangi teknikleri kullanmak istiyorsunuz?

Eğer taşınabilir bir komut dosyası oluştururken varsayalım, bu nedenle mutlaka PHP sonunda mod_php, FastCGI veya IIS altında veya maksimum yürütme zamanı sunucu düzeyinde zorlanır mı aday olacak mı bilmiyorum lütfen. Bu da muhtemelen kabuk-komut, vb dışladı

4 Cevap

PHP command line interface hangi kullandığınız web sunucuları tarafından dayatılan komut dosyası zaman sınırlamasına tabi değildir. Eğer komut yürütme otomatikleştirmek gerekiyorsa, cron ile zamanlayabilirsiniz.

EDIT ----

Ben sadece soru tekrar okuyun. Unix / Linux platformu üzerinde, PHP arka plan işlemleri spawn. Arka plan işlemi kendisi PHP CLI, bir kabuk, ya da ffmpeg gibi bir yürütülebilir bir örneği olabilir. Onun burada tarif: Running a Background Process from PHP on Linux

Unix / Linux üzerinde, cron işleri bir alternatif seçenektir. Belirli bir zamanda başlamak cron işleri planlamak ama iş yapılandırma ve parametreleri geçirerek neredeyse imkansız olabilir. Ve PHP kendisinden işleri zamanlama olamaz. (Bazı insanlar tarafından önerilen) bu wget komutu ile bir iş Planlama beyhude olduğunu:

wget http://website.com/time-consuming-script.php?parameter=whatever

Komutu olmalıdır:

php time-consuming-script.php parameter=whatever

Pencereler üzerinde, arka plan işlemi seçeneği var, ne de Cron hizmeti de. Ancak, arka plan işlemleri (psexec utility) and then there is the "task scheduler" service and the at komutu başlangıç ​​için geçici çözüm vardır.

Ne gerçekten bahsediyoruz iş kuyruk olduğunu. Bu ön uç isteği uyumsuz PHP kodu çalışan bir uygulamadır. PHP bunu yapmanın iki temel yolu vardır. Bir diğer şahsen aşina olduğum Zend Server iş Kuyruğunu kullanmaktır Gearman adlı bir program kullanmaktır. Ben bunu Do you Queue denilen yapabilirim nasıl bir blog yazısı var. Ben var uygulama kullanımı son derece kolay olduğunu bulduk.

Ne de denemek isteyebilirsiniz öncesinde mantık yürütme 0'a max_execution_time ayarlamaktır.

Yönlendirmeler ile küçük parçalar halinde bunu yaparken bir kludge, ama ne gibi görünüyor?

Yani yerleşik verme mekanizması max_execution_time sınırı vurmak başladı ben tam bir forum veritabanı yedeği (phpBB) ele tam olarak nasıl.

Ben ve 5000 satır parçalar büyük tablolar için, bir anda o bir tablo yaptım. (Bu tüm süreç içinde sınırlayıcı faktör ihracat yürütme zamanı olmadığı ortaya çıktı, ama phpmyadmin ithalat ele verebilir aslında dosya boyutu.)

Ihracat her yığın sonra, bir sonraki bloğun tablo numarası ve sorgu dizesinde bir satır başlatmak geri kendisine komut yönlendirme, başlığında bir meta yenileme etiketi ile bir sayfa döndü.

<?php if(!$all_done){
    $new_url=$_SERVER['PHP_SELF'].'?tablecount='.$count;
    if(!$tabledone && ""!=$start_row && null!=$start_row){
        $new_url.="&startrow=".$start_row;
    } else {
        $new_url.="&startrow=0";
    }
    echo('<meta http-equiv="refresh" content="0.5;url='.$new_url.'" />');
} ?>

Sayaçları yüzden ben GÖSTER TABLOLAR ile alınan ediyorum tablo adlarının bir dizi yineleme olabilir edildi.

Ben ihracatından (phpBB kendisi tarafından yeniden olabilir) dev kelime maç tablo itlaf fikir vardı önce, bu yedekleme komut tamamlamak için üzerinde yarım saat alacaktı.