2009-11-12 13 views
7

私はpcntl_forkを使用して、SMTP経由で電子メールを送信する子プロセスを開始しています。PHP - pcntl_forkによって開始された子プロセスの終了

子プロセスはPEAR Mailパッケージを使用して電子メールを送信しますが、リモートサーバーが応答しない場合、問題は、PHPで設定された時間制限に関係なく、応答を待っているだけです。 ini。

これを回避するために、私はpcntl_alarm関数を使用して、子プロセスがまだ実行中の場合に30秒後に関数をトリガーします。

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

私は子プロセスを強制終了しますが、システムにはプロセスが存在しません。

(接続が完了しないために)子プロセスが強制的に終了することなく強制的に終了し、無効なプロセスが蓄積されないようにするために、別の信号が必要ですか?

答えて

5

上記のように待機するか、親プロセスから親プロセスから切り離す必要があります。posix_setsid

1

この問題の通常の解決方法は、構成済みのローカルホストリレーを使用することです。 私は通常、postfixを使ってローカルホストのリレイを設定しています。

次に、ローカルリレーに電子メールを送信して、キューに入れてできるだけ早く受信者に送信します。

ローカルリレーに送信することについての良い点は、バウンス電子メールやその他の応答用に設定できることです。

私が知っている限り、SIGKILLはプロセスを解読するための非常に難しい方法ですが、(SIGSTOPまたはSIGTSTP)を試しましたか?

+0

私が悲惨な理由を送信している理由PHPを介してctlyは私が応答を取得し、成功/ソフトバウンス/ハードバウンスのためにそれを適切に処理することができるようにです。 SIGTERMとSIGKILLは私が知っている唯一のシグナルであり、SIGTERMは機能しませんでしたので、SIGKILLを使用しました。私はSIGSTOP/SIGTSTPを試みます。 – Tim

+0

ええと個人的には、2つの別々のスクリプトでこれを行います。バウンスを処理するためのローカルsmtpサービスを介した送信のためのもの、バウンスと成功に対処する自動ポップ/取得スクリプトの一種。 この理由の1つは、smtpにメールを配信するphpスクリプトがWebサーバーの子をブロックしていないことです。たとえば、最大20の子があり、すべての子が外部ソースへの接続を開始している場合、子が再び解放されるまで、他のサービスは利用できません。 – user207675

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

このようにして、親は子供からの応答を待っておらず、あなたはゾンビを持っていません。 email_script.phpであなたの電子メールを送信し、その応答をファイルに記録します。これはあなたの親スクリプトから解析することができます。

4

ゾンビの子供がいる場合は、wait人ではないことを意味します。 PHPエキスパートではありませんが、システムコールはwaitpid(2)です。例えば

waitpid(-1, NULL, WNOHANG); 

いつでも、またはいつでもSIGCHILDが得られます。各コールはゾンビ1つまで収穫されます。 WNOHANGは、退出した子どもがいない場合、ブロックするのではなく直ちにそれを返します。

wait manページにはピーターのanwserを完了するために、どのようにこのすべての作品...

1

の良いノート部を有し、pcntl_waitpid

を見てみましょうちょうど殺害した後、これを行う必要があります。 pcntl_waitpid($pid)

関連する問題