PHP Arkaplan Süreçler

10 Cevap php

Ben komut bitmiş var, bir PHP komut dosyası yapmaya çalışıyorum ama bunu yapmak için tasarlanmıştır işlemini bitirmek için 10 dakika sürer gibi. Bu ancak ben sayfa yüklendiğinde can sıkıcı bütün bu süre tutmak zorunda tahmin, bir sorun değildir. Ben işlemini başlatmak ve daha sonra 10mins geri gelmek ve sadece üretti günlük dosyasını görüntülemek böylece ben alabilir miyim?

10 Cevap

Peki, "ignore_user_abort (true)" kullanabilirsiniz

Yani komut çalışmaz (script süresi üzerinde bir göz tutmak, belki de eklemek "set_time_limit (0)") devam edecek

Ama burada bir uyarı: Bu iki çizgi ile bir komut dosyası durdurmak mümkün olmayacaktır:

ignore_user_abort(true); 
set_time_limit(0);

Doğrudan sunucuya erişmek ve orada süreci öldürebilir hariç! (Orada, kendisi üzerinden arama, sonsuz bir döngü yapılır ve tekrar tekrar, sunucu bir cırtlak durdurmak için geliyor yapılmış, bağırdı var ...)

Eğer kuyruğunu işlenmesi için bir kuyruk ve bir dış komut dosyası olmalıdır gibi geliyor.

Örneğin, PHP komut dosyası bir veritabanı tablosuna bir giriş koymak ve hemen dönmelidir. Sonra, her dakika çalışan bir cron kuyruğunu çatal ve her iş için bir işlem denetler.

Burada avantajı 10 dakika boyunca bir apache konu up kilit kalmamasıdır.

Ben windows altında sürecinin bu tür sorunları çok vardı; Benim durum ben "script" yanıtı hakkında umursamadı biraz farklı oldu - Ben başlamak ve uzakta çalışan meşgul iken diğer sayfa istekleri geçmesi için izin vermek için komut istedi.

Nedense; Ben (apache ve php hem de yaklaşık 20 dakika sonra zaman aşımına kuruldu) yaklaşık 60 saniye sonra başka bir istekleri ya da zamanlamasını asılı ya onunla sorunları vardı; Ayrıca yine 5 dakika (varsayılan) sonra firefox kez bu noktadan sonra firefox ayarları değiştirmeden tarayıcı aracılığıyla oluyor ne bilmiyorum böylece çıkıyor.

Ben şöyle cli modunda bir php açmak için sürecin açık ve süreç yakın yöntemlerle sona erdi:

pclose(popen("start php myscript.php", "r"));

Bu (başlangıç ​​kullanılarak) php sürecini açmak ve sonra ancak gereken süre çalışan başlangıç ​​süreci terk php öldürecek - yine elle kapatmaya süreci öldürmek gerekiyordu. Bu her zaman Muhalifler ayarlamak için sana ihtiyacım yoktu ve bunu biraz daha ayrıntı devam ve çıkış denilen geçerli sayfayı izin verebilir.

Bu konuda tek sorun, komut dosyası herhangi bir veri göndermek gerekiyorsa, ya başka bir kaynak aracılığıyla bunu yapmak ya da parametre olarak "komut satırı" bunu iletmekten ediyorum ki; hangi nedenle güvenli değildir.

Biz olsa gerek ne güzel çalıştı ve komut her zaman başlar ve herhangi bir kesinti olmadan çalışmasına izin verilir sağlar.

Ben shell_exec komutu aradığınız ne olduğunu düşünüyorum.

Ancak, güvenli modda devre dışı bırakır.

Bu konuda PHP kılavuzu makale burada: http://php.net/shell_exec

Bu konuda bir makale burada var: http://nsaunders.wordpress.com/2007/01/12/running-a-background-process-in-php/

Eğer kullanmak ... Bu arka planda çalışan komut dosyası CLI çalıştırmak ve isterseniz hatta bir cronjob olarak çalıştırabilirsiniz başka bir seçenek yoktur.

ör

> #!/usr/bin/php -q

<?php

//process logs

?>

Bu cronjob olarak kurulum olabilir ve bu örnekler olsa da Unix tabanlı işletim sistemi için .... hiçbir zaman sınırlaması ile yürütecek.

FYI I have a php script running with an infinite loop which does some processing and has been running for the past 3 months non stop.

Zuk.

Ben bu çalışacaktır eminim:

<?php 

pclose(popen('php /path/to/file/server.php &'));
echo "Server started. [OK]"; 

?>

The '&' is important. It tells the shell not to wait for the process to exit.

Ayrıca senin php bu kodu kullanabilirsiniz ("bastiandoeen" dedi)

ignore_user_abort(true); 
set_time_limit(0);

Sunucu stop komutuyla:

<?php

$output;
exec('ps aux | grep -ie /path/to/file/server.php | awk \'{print $2}\' | xargs kill -9 ', $output);
    echo "Server stopped. [OK]";

?>