[英]PHP 5.6 signal handling: declare(ticks=1) vs pcntl_signal_dispatch()
我正在用PHP 5.6编写守护程序。 到目前为止,它基本上是带有mainLoop()
方法的Daemon
类, mainLoop()
具有无限循环。 在每次迭代中,mainLoop执行一系列步骤。
我需要它来实现“优美的杀死”机制:如果SIGINT或SIGTERM到达,守护进程必须在死亡之前完成当前迭代的当前步骤。
我的想法是默认使用静态变量Daemon::CONTINUE
TRUE。 当SIGINT或SIGTERM到达时,将其设置为FALSE。 在每次迭代中,守护程序在进行下一步之前都会检查self::CONTINUE
是否已切换为FALSE,如果已切换为FALSE,则它将返回。
我知道做到这一点的方法是使用pcntl_signal
。 看来我可以将其与pcntl_signal_dispatch()
declare(ticks=1)
或pcntl_signal_dispatch()
,但不确定是否有区别。
是否declare(ticks=1)
使进程在每次滴答之后检查信号是否到达,而pcntl_signal_dispatch()
仅在调用时才显式检查信号?
这些是我之前描述的两种方式的摘要。 他们都正确吗? 我应该使用哪一个?
方式1
<?php
declare(ticks=1) {
pcntl_signal(SIGINT, function($signo) {Daemon::CONTINUE = FALSE;});
pcntl_signal(SIGTERM, function($signo) {Daemon::CONTINUE = FALSE;});
}
public class Daemon {
public static $CONTINUE = TRUE;
function mainLoop() {
...
if (self::CONTINUE === FALSE)
return;
...
}
}
方式二
<?php
pcntl_signal(SIGINT, function($signo) {Daemon::CONTINUE = FALSE;});
pcntl_signal(SIGTERM, function($signo) {Daemon::CONTINUE = FALSE;});
public class Daemon {
public static $CONTINUE = TRUE;
function mainLoop() {
...
pcntl_signal_dispatch();
if (self::CONTINUE === FALSE)
return;
...
}
}
谢谢你的支持。
好的,经过一些测试和调试,我尝试了两种解决方案。 如果有人遇到同样的问题,我将在这里留下我的看法。
似乎带有clarify(ticks = 1)的方式1无效; 我不明白为什么。
相反,使用pcntl_signal_dispatch()的方式2看起来不错。
经过更深入的研究,我认为方法2仍然是我的最佳选择。
实际上,如果clarify(tick = 1)有效,它将在每个刻度上运行pcntl_signal,大致对应于每个代码行的执行。 这可能会降低性能。
相反,显然pcntl_signal_dispatch)仅在调用时处理待处理的信号,因此应该降低性能。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.