PHP CLI pcntl 在 PHP7.0 Ubuntu xenial 服务器中不工作
PHP CLI pcntl not working in PHP7.0 Ubuntu xenial server
我在 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 中工作正常,但是当尝试在 Ubuntu 16.04 中使用 PHP7.0 执行并尝试发送信号(杀死 PID)时,PHP CLI 不会停止并保持 运行nig.
在 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();
这段代码不停
关于 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();
?>
我在 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 中工作正常,但是当尝试在 Ubuntu 16.04 中使用 PHP7.0 执行并尝试发送信号(杀死 PID)时,PHP CLI 不会停止并保持 运行nig.
在 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();
这段代码不停
关于 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();
?>