【发布时间】:2018-03-19 16:27:27
【问题描述】:
我正在用 PHP 5.6 编写一个守护进程。到目前为止,它基本上是一个带有mainLoop() 方法的Daemon 类,它具有无限循环。在每次迭代中,mainLoop 都会执行一系列步骤。
我需要它来实现“优雅的终止”机制:如果 SIGINT 或 SIGTERM 到达,守护进程必须在死亡之前完成当前迭代的当前步骤。
我的想法是默认使用静态变量Daemon::CONTINUETRUE;当 SIGINT 或 SIGTERM 到达时,它被设置为 FALSE。
在每次迭代中,在传递到下一步之前,守护程序检查self::CONTINUE 是否已切换为 FALSE,如果已切换,则返回。
我知道这样做的方法是使用pcntl_signal。看来我可以将它与declare(ticks=1) 或pcntl_signal_dispatch() 一起使用,但我不确定其中的区别。
declare(ticks=1) 是否在每个滴答后检查信号的到达,而 pcntl_signal_dispatch() 仅在我调用它时才显式检查信号?
这些是我之前描述的两种方式的 sn-ps。他们都正确吗?我应该使用哪一个?
方式 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;
...
}
}
方式 2
<?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;
...
}
}
感谢您的支持。
【问题讨论】: