什么';s在php中声明(ticks)和信号处理程序之间的关系


What's the relation between declare(ticks) and a signal handler in php

我有一些类似的代码,我想了解fork是如何工作的,但我对declare(ticks=1)感到困惑。当我把它放在第一行时,在子进程完成后,将调用信号处理程序,这就是我想要的;但当我删除它时,信号处理程序将永远不会被调用!所以,我想知道蜱虫是如何影响信号处理的。

<?php
declare(ticks=1);
function sigHandler($signal)
{
    echo "a child exited'n";
}
pcntl_signal(SIGCHLD, sigHandler, false);
echo "this is " . posix_getpid() . PHP_EOL;
for($i=0; $i<3; $i++)
{
    $pid = pcntl_fork();
    if($pid == -1) 
    {   
        echo 'fork failed ' . PHP_EOL;
    }   
    else if($pid)
    {   
    }   
    else
    {   
        $pid = posix_getpid();
        echo 'child ' . $pid . ' ' . time() . PHP_EOL;
        sleep(rand(2,5));
        echo 'child ' . $pid . ' done ' . time() . PHP_EOL;
        exit(0);
    }   
}
do
{
    $pid = pcntl_wait($status); 
    echo 'child quit ' . $pid . PHP_EOL;
}while($pid > 0); 
echo 'parent done' . PHP_EOL;
?>

次要观察(请引用函数名称):

pcntl_signal(SIGCHLD, 'sigHandler', false);

涉及两种不同的API。

  • pcntl_wait()调用一直处于阻塞状态,直到它从内核收到通知为止
  • 中断处理是PHP解释器中的一个事件循环。这是一个破解功能,从PHP5.3开始,有更好的方法~pcntl_signal_dispatch()。
    • 要回答这个问题,让声明勾号就像打开手机铃声一样,否则你永远不会注意到来电
    • PHP5.3方法是一种更好的工程方法,也更可控
    • 大多数信号的默认信号处理程序是sigignore,它接收中断而不执行任何操作。由于您已经注册了用户处理程序,我怀疑它是否被使用
    • 如果不直接设置,我永远无法发现刻度的默认值
    • 将ticks设置为一个小值确实会使脚本运行速度减慢,但您需要进行大量的处理和监视才能注意到这一点。我想,这会降低可预测的执行成本,这是因为在堆栈中复制了一些东西
    • 如果没有declare ticks或pcntl_signal_dispatch(),则永远不会拾取信号。如果你在写简单的网页,它会很快终止;这可能是最明智的政策
    • declare-ticks需要仔细测试,因为它有混淆的范围规则。最安全的方法是将其放在第一个脚本的开头,比如在Perl中使用严格的