免责声明
我很清楚 PHP 在这种情况下可能不是套接字服务器的最佳选择。请不要建议不同的语言/平台——相信我——我已经从各个方向听到了。
在Unix 环境中工作并使用PHP 5.2.17,我的情况如下 - 我在 PHP 中构建了一个与 flash 客户端通信的套接字服务器。我的第一个问题是每个传入的连接都会阻塞顺序连接,直到它完成处理。我通过使用 PHP 的pcntl_fork()
. 我成功地生成了许多子进程(将它们的 PID 保存在父进程中),它们负责向其他客户端广播消息,因此“释放”父进程并允许它继续处理下一个连接[s]。
我现在的主要问题是处理/处理这些死/僵尸子进程的集合并终止它们。我已经(一遍又一遍地)阅读了pcntl_fork()的相关 PHP 手册页,并意识到父进程负责清理其子进程。当子进程执行一个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天后更新
经过一些额外的研究,我自己已经回答了这个问题,如果你仍然能够忍受我的漫无边际的随意继续。