Php script kullanıcı tarayıcısı kapalı olsa bile proccess devam edebilir miyim?

7 Cevap

Örneğin, orada veritabanı üzerinde bazı tablolarını günceller çok basit bir php script, ama bu süreç (belki 10 dakika) uzun zaman alır. Bu nedenle, ben bazen kullanıcılar bekleyin ve tarayıcıyı kapatmak veya başka bir web sayfasına gitmez çünkü kullanıcı, tarayıcıyı kapalı olsa bile bu script bu sürece devam etmek istiyorum.

7 Cevap

Doğrudan sorunuzu yanıtlamak için, bkz: ignore_user_abort

Daha geniş anlamda, muhtemelen burada bir mimari sorun var.

Birçok kullanıcı bu şeyler başlatabilir varsa, web uygulama kuyruğunda çeşit işleri eklemek, ve tüm çalışma sayesinde çiğnemek arka plan işlemleri bir dizi sayıda isteyeceksiniz.

Görev 10 dakika sürerse, doğrudan yürütmek için bir tarayıcı kullanmayın. Diğer seçenek var:

  • Use a cronjob to execute the task periodically.
  • Have the browser request insert a new row into a database table so that a regular cronjob can process the new row and execute the PHP script with the appropriate arguments
  • Have the browser request write a message to queue system, which has a subscriber listening for such events (which then executes the script).

Bu önerilerden bazıları muhtemelen durumunuza overkill iken uyumsuz tamamlanması böylece, anahtar, özelliğini birleştirerek, işin yürütme tarayıcı isteğini-Couple de etmektir.

Eğer ilerleme ile güncellenen tarayıcı penceresini gerekiyorsa, iş durumunu almak için bir periyodik idam AJAX isteği kullanmanız gerekecektir.

PHP komut dosyası genellikle 30 saniye ile, istemci bağlantıyı (bunu yaparken bir güvenlik riski olurdu) sonlandırır sonra yayınlanmaya devam, ama sadece kadar max_execution_time (set php.ini veya bir PHP komut dosyası aracılığıyla edecek default) ..

Örneğin:

<?php
    $fh = fopen("bluh.txt", 'w');
    for($i=0; $i<20; $i++) {
        echo $i."<br/>";
        fwrite($fh,$i."\n");
        sleep(1);
    }
    fclose($fh);
?>

Tarayıcı bu yayınlanmaya başlaması ve tamamlanmadan önce tarayıcınızı kapatın. Eğer 20 saniye sonra dosyası tüm değerleri içerdiğini göreceksiniz $i.

Döngüsü için 20 yerine 100 üst sınır değiştirme, ve bunu sadece dışarı Çünkü PHP'nin max_execution_time komut kez. 0-29 çalışır ve ölür bulacaksınız.

script tamamen sunucu tabanlı (kullanıcıya herhangi bir geri besleme) ise, bu istemci kapalı bile olsa yapılacaktır.

PHP genel mimarisi müşterilerine kullanıcıya cevap veren bir komut dosyası için bir istek gönderebilirsiniz olmasıdır. hiçbir kullanıcı artık diğer tarafta olmasa bile yazısı hala yürütecek kullanıcıya geri verilmesi halinde. Daha basit: Düzenli senaryo üzerinde sunucu ve istemci arasında sürekli bir bağlantı onların olduğunu.

Sen PHP script php script olurdu bu durumda çalıştırmak için zaman ve hangi komut içeren bir crontab dosyası kullanarak her 20 dakikada bir çalışacak yapabilirsiniz.

Evet. Kullanıcı tarayıcıyı kapalı olmadığını, sunucu bilmiyor. En azından hemen fark etmez.

No: (o nasıl yapılandırıldığına bağlı olarak), muhtemelen sunucu 10 dakika çalıştırmak için bir php komut dosyası için izin vermez. Ucuz bir ben makul bir tepki süresi daha uzun çalışan bir komut dosyası güvenmek olmaz barındırma paylaştı.

Bir sunucu tarafı komut ne olursa olsun müşteri ne yaptığını ne yaptığını gidecek.

EDIT: Bu arada, size açmak için 10 dakika sürer sayfaları var istediğinizden emin misiniz? Ben size (olan ürün zamanında temelinde cron tarafından yürütülen) bir görev sıra istihdam ve bir "Tamam, ben onu duyuyorum" sayfaya kullanıcıyı yönlendirmek için öneririz.