免責事項
この場合、ソケットサーバーにとってPHPが最良の選択ではなかった可能性があることを私はよく知っています。異なる言語/プラットフォームを提案することは控えてください-私を信じてください-私はそれをあらゆる方向から聞いてきました。
Unix環境で作業し、PHP 5.2.17を使用している場合、私の状況は次のとおりです。フラッシュクライアントと通信するソケットサーバーをPHPで構築しました。私の最初の悩みは、各着信接続が処理が完了するまで順次接続をブロックすることでした。PHPを利用してこれを解決pcntl_fork()
しました。他のクライアントへのメッセージのブロードキャストを処理する多数の子プロセス(親にPIDを保存)を正常に生成できたため、親プロセスを「解放」して、次の接続の処理を続行できるようになりました。
現在の私の主な問題は、これらのデッド/ゾンビの子プロセスのコレクションを処理/処理し、それらを終了することです。pcntl_fork()に関連するPHPのマニュアルページを(何度も)読んだところ、親プロセスが子のクリーンアップを担当していることがわかりました。親プロセスは、子がを実行すると、子からSIGNALを受け取りexit(0)
ます。シグナルハンドラーpcntl_signal()
を設定する関数を使用して、そのシグナルを「キャッチ」することができます。
私のsignal_handlerは次のようになります:
declare(ticks = 1);
function sig_handler($signo){
global $forks; // this is an array that holds all the child PID's
foreach($forks AS $key=>$childPid){
echo "has my child {$childPid} gone away?".PHP_EOL;
if (posix_kill($childPid, 9)){
echo "Child {$childPid} has tragically died!".PHP_EOL;
unset($forks[$key]);
}
}
}
私は確かに、削除する必要がある関連する正しい子PIDを含む両方のエコーを確認していますが、
posix_kill($childPid, 9)
私が同義であると理解してkill -9 $childPid
いるのは、実際にはプロセスを削除していませんが、TRUEを返しています...
のマニュアルページposix_kill
から取得:
成功した場合はTRUEを返し、失敗した場合はFALSEを返します。
コマンドを使用して子プロセスを監視していps
ます。システム上では次のように表示されます。
web5 5296 5234 0 14:51 ? 00:00:00 [php] <defunct>
web5 5321 5234 0 14:51 ? 00:00:00 [php] <defunct>
web5 5466 5234 0 14:52 ? 00:00:00 [php] <defunct>
ご覧のとおり、これらのプロセスはすべて、PIDが5234
私は私の理解に何かが欠けていますか?私はなんとかすべてを機能させることができたようです(そしてそれは機能します)が、システム上に無数のゾンビプロセスが残っています!
ゾンビの黙示録の私の計画は堅実です-しかし、ゾンビの子プロセスを殺さない
場合でも、一体何ができるでしょうか?sudo kill -9
10日後に更新
私はいくつかの追加の調査の後にこの質問に自分で答えました、あなたがまだ私のとりとめのないことに耐えることができるならば、意のままに進んでください。