声明(ticks)与php中的信号处理程序之间的关系是什么?

前端之家收集整理的这篇文章主要介绍了声明(ticks)与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;
?>
次要观察(引用函数名称pls.):
pcntl_signal(SIGCHLD,'sigHandler',false);

涉及两种不同的API.

> pcntl_wait()调用阻塞,直到它从内核收到通知.
>中断处理是PHP解释器内部的事件循环.这是一个hack功能,从PHP5.3开始,有一种更好的方法可以做到这一点~pcntl_signal_dispatch().

>要回答问题,声明滴答声就像打开手机铃声一样,否则你永远不会注意来电.> PHP5.3方法工程更好,而且更可控.>大多数信号的默认信号处理程序是sigignore,它接收中断并且什么也不做.正如您已注册用户处理程序,我怀疑这是否正在使用.>我没有能够直接找到刻度线的默认值.>将ticks设置为较小的值会使脚本abit运行得更慢,但是你需要进行繁重的处理和监视才能注意到这一点.它会降低可预测的执行成本,我想是因为在堆栈中复制了一些东西.>如果没有声明滴答声或pcntl_signal_dispatch(),则不会拾取信号.如果您正在编写简单的网页,它会很快终止;这可能是最明智的政策.>声明刻度需要仔细测试,因为它具有令人困惑的范围规则.将它放在第一个脚本的最安全的方法,比如在Perl中使用strict.

原文链接:https://www.f2er.com/php/137644.html

猜你在找的PHP相关文章