PHP7 漏洞 pcntl_signal(SIGCHLD, SIG_IGN);如何杀死僵尸?
PHP7 Bugs pcntl_signal(SIGCHLD, SIG_IGN); how to kill zombies?
如果我运行它:
<?php
declare(ticks = 1);
for($i=0;$i<300;$i++){
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
usleep(2500);
} else {
echo 'Child'.$i."\r\n";
sleep(mt_rand(1,3));
exit;
}
}
echo 'Test123';
pcntl_signal(SIGCHLD, SIG_IGN);
sleep(60)
echo 'Test456';
?>
于 PHP5。我看到多个 Child
和 Test123
,60 秒后,我看到 Test456
.
但是!在 PHP7 上,我看到多个 Child
Test123
而不是 Test456
- 睡眠不起作用。
在生产中 php-daemon 我看到 pcntl_signal(SIGCHLD, SIG_IGN);
不再帮助杀死僵尸了!没用。
我能做什么?
好的 :) 我找到了答案 :)
declare(ticks = 1);
- 在脚本顶部
那个函数到全局:
function signal_handler($signal) {
switch($signal) {
case SIGCHLD:
while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status);
echo "Child $status completed\n";
}
exit;
}
}
这是在 parent 中的分支之后
pcntl_signal(SIGCHLD, "signal_handler");
$p = pcntl_waitpid(-1,$status,WNOHANG);
没有处理程序。创建后在父级中。
如果我运行它:
<?php
declare(ticks = 1);
for($i=0;$i<300;$i++){
$pid = pcntl_fork();
if ($pid == -1) {
die('could not fork');
} else if ($pid) {
usleep(2500);
} else {
echo 'Child'.$i."\r\n";
sleep(mt_rand(1,3));
exit;
}
}
echo 'Test123';
pcntl_signal(SIGCHLD, SIG_IGN);
sleep(60)
echo 'Test456';
?>
于 PHP5。我看到多个 Child
和 Test123
,60 秒后,我看到 Test456
.
但是!在 PHP7 上,我看到多个 Child
Test123
而不是 Test456
- 睡眠不起作用。
在生产中 php-daemon 我看到 pcntl_signal(SIGCHLD, SIG_IGN);
不再帮助杀死僵尸了!没用。
我能做什么?
好的 :) 我找到了答案 :)
declare(ticks = 1);
- 在脚本顶部
那个函数到全局:
function signal_handler($signal) {
switch($signal) {
case SIGCHLD:
while (pcntl_waitpid(0, $status) != -1) {
$status = pcntl_wexitstatus($status);
echo "Child $status completed\n";
}
exit;
}
}
这是在 parent 中的分支之后
pcntl_signal(SIGCHLD, "signal_handler");
$p = pcntl_waitpid(-1,$status,WNOHANG);
没有处理程序。创建后在父级中。