Bir kullanıcı sayfayı terk ettikten sonra php yürütme durdurmak mı?

4 Cevap php

Bazı form girişi dayalı nispeten zaman alıcı komut dosyası çalıştırmak istiyorum, ama yerine cron çare istemem, bu yüzden durdurmak eğer ajax yoluyla istenen bir php sayfa tamamlanıncaya kadar çalıştırmak için devam ya da eğer ben merak ediyorum eğer Kullanıcı sayfayı bırakır.

Bunun öncesinde her şey hala yürütülür dosyanın sonunda bir json_encode kadar tarayıcı aslında çıkış değil, yani?

4 Cevap

Duruma göre değişir.

Dan http://us3.php.net/manual/en/features.connection-handling.php:

When a PHP script is running normally the NORMAL state, is active. If the remote client disconnects the ABORTED state flag is turned on. A remote client disconnect is usually caused by the user hitting his STOP button.

You can decide whether or not you want a client disconnect to cause your script to be aborted. Sometimes it is handy to always have your scripts run to completion even if there is no remote browser receiving the output. The default behaviour is however for your script to be aborted when the remote client disconnects. This behaviour can be set via the ignore_user_abort php.ini directive as well as through the corresponding php_value ignore_user_abort Apache httpd.conf directive or with the ignore_user_abort() function.

Bu sorunuzun cevabı "kullanıcı sayfasını bırakırsa Evet, komut dosyası sonlanacaktır" olduğunu söylemek gibi görünüyor.

Ancak fark kullanılan backend SAPI bağlı olarak (örneğin, mod_php), php cannot detect that the client has aborted the connection until an attempt is made to send information to the client. Uzun koşu komut bir sorunu yoksa flush() komut kullanıcı bağlantıyı kapattı bile yayınlanmaya devam edebilir.

Eğer do yakalamak için bu çağrıları neden olacak ve müşteri için onları göndermek olmaz output buffering, sahip flush() periyodik aramalar sorunu şeyleri bile komplike script zaten tamamlar kadar!

Further şeyler zorlaştıran Eğer yanıtını tampon Apache işleyicileri yüklü varsa (örneğin, mod_gzip) sonra tekrar php bağlantısı kapalı olduğunu algılamaz ve komut kamyon devam edecektir .

Vay.

Bu sizin ayarlarınıza bağlıdır - genellikle durur ama ignore_user_abort() devam yapmak için kullanabilirsiniz.

Kullanıcı HTTP bağlantısı sonlandırıldığında web sunucusu ve / veya PHP konfigürasyonuna bağlı olarak, PHP süreç, ya da olmayabilir, konu öldürebilir. Kullanıcı uzakta sayfasından yürürken bir AJAX isteği askıda ise, bu ontop (garanti değil) sunucu config (garanti değil) isteği öldürme tarayıcıda bağlıdır. Değil duymak istediğiniz cevabı!

Ben düz bir dosya veya veritabanında bir iş kuyruğu oluştururken tavsiye ederim ki, bir PHP daemon işler için yoklamak sürekli çalışan. Bu cron gecikme muzdarip ama kullanılabilir bir düzeye CPU / bellek kullanımını tutar. Iş tamamlandığında AJAX almak için, düz dosya / veritabanı sonuçları yerleştirin. Ya da iş bittikten sonra e-posta kullanıcı (benim tercih edilen yöntem) için söz veriyorum.

Umut olur

Bu bağlantıyı sonlandırma değil benim durumumda için gerçek çözüm bulundu. Sonraki önce kapatmak için gerekli benim Apache / Php sunucu üzerinde OTURUM başlayabilirsiniz.

Browser waits for ajax call to complete after abort.