PHP - Killing çocuk süreç pcntl_fork tarafından başlatılan

5 Cevap php

Ben SMTP üzerinden bir e-posta göndermek için bir alt sürecini başlatmak için pcntl_fork kullanıyorum.

Alt süreç e-posta göndermek için PEAR Posta paketi kullanır, ama uzak sunucu sadece sonsuza kadar bağımsız php.ini içinde herhangi bir zaman sınırı, bir yanıt bekliyor çalışır sürecini yanıt vermezse sorun.

Bu etrafında ben hala çalışıyorsa eğer çocuk süreç öldürür 30 saniye sonra bir fonksiyonu tetiklemek için pcntl_alarm fonksiyonunu kullanarak ediyorum almak için.

function handlesig($sig) {
    global $pid,$node,$resend;
    posix_kill($pid,SIGKILL);
    mysql_query("insert into log (event) values ('Timed out!')");
}

Ama çocuk süreci öldürür zaman sistemde bir feshedilmiş süreci ile sol.

Ben hala (bağlantı bitirmek asla çünkü) bağlantısı beklemeden ölmek çocuk sürecini zorlayacaktır ve feshedilmiş süreçlerin birikmesini önlemek olacaktır kullanmanız gereken farklı bir sinyal var mı?

5 Cevap

Yukarıda açıklandığı gibi, bunun için bekleyin ya da alt süreç kullanarak üst ayırmak için yapmak ya da gerek posix_setsid

Eğer zombi çocuklar varsa, bu wait onlar için ing değil demektir. PHP uzmanı, ama sistem çağrısı değil waitpid(2). örneğin çağrı

waitpid(-1, NULL, WNOHANG);

Her şimdi ve sonra, ya da almak her SIGCHILD. Her arama bir zombi kadar kapacaktır. WNOHANG hiçbir exitted çocuklar varsa yerine engelleme hemen döner yapar.

wait man sayfasında nasıl bu tüm eserlerini iyi notlar bölümü vardır ...

The normal solution for this problem is useing a good configured local host relay. What i normaly do is setting up a local host releay useing postfix.

Sonra im gonna o sıralar yerel röle, e-posta göndermek ve en kısa sürede alıcıya gönderebilirsiniz.

Yerel röleye göndermek hakkında iyi bir şey bounce e-postalar ve diğer answeres için yapılandırabilirsiniz olmasıdır.

Eğer (SIGSTOP veya SIGTSTP) deneyin vermedi, Bildiğim kadarıyla SIGKILL bir süreç aşağı shuting için çok zor bir yöntem olduğunu biliyorum gibi, feshedilmiş hakkında soru için?

Peter anwser tamamlamak için, pcntl_waitpid bakabilirsiniz

Just need do this after the kill: pcntl_waitpid($pid)

exec(PATH_TO_PHP . " email_script.php $params > /dev/null 2>&1 &");

Bu şekilde ebeveyn çocuğun bir yanıt beklemiyor ve bir zombi yok. Email_script.php e-posta göndererek ele almak ve sizin ana komut dosyası ya da ne değildir analiz edebilen bir dosyaya tepki oturum açın.