什么时候是PHP<;5.3.0守护程序脚本是否接收信号?

什么时候是PHP<;5.3.0守护程序脚本是否接收信号?,php,daemon,Php,Daemon,我有一个PHP脚本在工作,这是一个工作人员;它的主要任务是检查数据库表中是否有新的作业,如果有,则执行这些作业。但是工作会以阵阵的形式出现,其间有很长的间隔,所以我设计了一个睡眠周期,比如: while(true) { if ($jobs = get_new_jobs()) { // Act upon the jobs } else { // No new jobs now sleep(30); } } 很好,但在某些情况下,这意味着在执行新任务之前可能会有

我有一个PHP脚本在工作,这是一个工作人员;它的主要任务是检查数据库表中是否有新的作业,如果有,则执行这些作业。但是工作会以阵阵的形式出现,其间有很长的间隔,所以我设计了一个睡眠周期,比如:

while(true) {
  if ($jobs = get_new_jobs()) {
    // Act upon the jobs
  } else {
    // No new jobs now
    sleep(30);
  }
}
很好,但在某些情况下,这意味着在执行新任务之前可能会有30秒的延迟。由于这是一个守护程序脚本,我想我应该尝试使用钩子捕获一个SIGUSR1信号来推动脚本唤醒,如:

$_isAwake = true;
function user_sig($signo) {
  global $_isAwake;
  daemon_log("Caught SIGUSR1");
  $_isAwake = true;
}
pcntl_signal(SIGUSR1, 'user_sig');

while(true) {
  if ($jobs = get_new_jobs()) {
    // Act upon the jobs
  } else {
    // No new jobs now
    daemon_log("No new jobs, sleeping...");
    $_isAwake = false;
    $ts = time();
    while(time() < $ts+30) {
      sleep(1);
      if ($_isAwake) break; // Did a signal happen while we were sleeping? If so, stop sleeping
    }
    $_isAwake = true;
  }
}
$\u isAwake=true;
函数用户_sig($signo){
全球美元;
daemon_log(“捕获的SIGUSR1”);
$\u isAwake=true;
}
pcntl_信号(SIGUSR1,‘用户_信号’);
while(true){
如果($jobs=get_new_jobs()){
//按职务行事
}否则{
//现在没有新工作了
守护进程日志(“没有新作业,正在休眠…”);
$\u isAwake=false;
$ts=时间();
while(time()<$ts+30){
睡眠(1);
if($\u isAwake)break;//我们睡觉时有信号吗?如果有,停止睡觉
}
$\u isAwake=true;
}
}
我将
sleep(30)
分解为更小的睡眠位,以防信号没有中断
sleep()
命令,我认为这最多会导致1秒的延迟,但在日志文件中,我发现在整整30秒过去之前,SIGUSR1不会被捕获(可能是外部
while
循环复位)

我找到了这个命令,但这只适用于PHP5.3及更高版本。如果我使用的是该版本,我可以在调用
If($\u isAwake)
之前继续调用该命令,但目前我使用的是5.2.13


在什么样的情况下,PHP版本中解释的信号队列没有显式调用队列解析的方法?我是否可以在睡眠循环中插入一些其他无用的命令,在其中触发信号队列解析?

修复了我自己的问题:答案是“”声明。作为守护进程启动的一部分,我已经完成了
declare(ticks=1);
操作,但它似乎没有延续到主脚本(因为它在一个函数中,在一个include文件?中)。在
while(true)
循环之前添加
declare(ticks=1)
行会导致信号立即通过(即,
sleep(1)
命令会引起滴答声,因此从睡眠中醒来后,信号会被处理)