我在PHP 5.5.9中使用此脚本:
declare(ticks = 1);
pcntl_signal(SIGTERM, array($this, 'stopSending'));
pcntl_signal(SIGINT, array($this, 'stopSending'));
pcntl_signal(SIGUSR1, array($this, 'stopSending'));
pcntl_signal(SIGUSR2, array($this, 'stopSending'));
pcntl_signal(SIGQUIT, array($this, 'stopSending'));
pcntl_signal(SIGHUP, array($this, 'stopSending'));
public function stopSending($signals)
{
echo "hello";
exit();
}
while (true) {
// some logic
}
在Ubuntu 14中工作正常,但是当尝试使用PHP7.0在Ubuntu 16.04中执行并尝试发送信号(kill PID)时,PHP CLI不会停止并保持runnig。
在Ubuntu 16.04中,我检查了pcntl扩展,这没关系:
>php -m | grep pcntl
pcntl
我跑步时没有任何错误,但都没有停止(或显示回声)。
PHP7和pcntl有问题吗?
更新
问题在于将while循环封装到函数中:
function start()
{
while (true) {
// some logic
}
}
declare(ticks = 1);
pcntl_signal(SIGTERM, "stopSending");
pcntl_signal(SIGINT, "stopSending");
pcntl_signal(SIGUSR1, "stopSending");
pcntl_signal(SIGUSR2, "stopSending");
pcntl_signal(SIGQUIT, "stopSending");
pcntl_signal(SIGHUP, "stopSending");
function stopSending($signals)
{
echo "hello";
exit();
}
start();
此代码不会停止。
答案 0 :(得分:3)
PHP信号处理有一个很好的解释here。因此,确保您的信号处理程序在适当的时间内触发的最佳方法是这样的:
<?php
declare(ticks = 1);
function start()
{
while (true) {
pcntl_signal_dispatch();
}
}
pcntl_signal(SIGTERM, "stopSending");
pcntl_signal(SIGINT, "stopSending");
pcntl_signal(SIGUSR1, "stopSending");
pcntl_signal(SIGUSR2, "stopSending");
pcntl_signal(SIGQUIT, "stopSending");
pcntl_signal(SIGHUP, "stopSending");
function stopSending($signals)
{
echo "hello";
exit();
}
start();
?>