如何在 PHP 中设置阻塞等待信号的进程

How do I set the procss blocked for waiting for a signal in PHP

我正在编写一个计时器脚本,使用 signal.Every 1 秒向进程发送一个 SIGALRM,然后捕获信号并检查是否有任务要做。 我使用 pcntl_alarm(1) 发送信号,但在接收信号之前,进程执行并退出。 我想是否有一种方法可以设置阻塞等待 signal.I 已使用 base_event 的进程,但它很重。 所以任何人都可以帮助 me.Thanks 很多。

那是我的剧本(对不起中文^_^):

<?php
/**
*定时器
*/
class Timer
{
    //保存所有定时任务
    public static $task = array();

    //定时间隔
    public static $time = 1;

    /**
    *开启服务
    *@param $time int
    */
    public static function run($time = null)
    {
        if($time)
        {
            self::$time = $time;
        }
        self::installHandler();
        pcntl_alarm(1);
        do{ sleep(2); }while(true);
     }
    /**
    *注册信号处理函数
    */
    public static function installHandler()
    {
        echo "installHandler\n";
        pcntl_signal(SIGALRM, array('Timer','signalHandler'),false);
        pcntl_alarm(1);
    }

    /**
    *信号处理函数
    */
    public static function signalHandler()
    {
        self::task();
    }

    /**
    *执行回调
    */
    public function task()
    {
        if(empty(self::$task))
        {
            return ;
        }
        foreach(self::$task as $time => $arr)
        {
            $current = time();
            $func = $arr['func'];
            $argv = $arr['argv'];
            $interval = $arr['interval'];
            $persist = $arr['persist'];

            if($current == $time)
            {
               call_user_func_array($func, $argv);
            }
            if($persist)
            {
               self::$task[$current+$interval] = $arr;
            }
            unset(self::$task[$time]);
        }
        pcntl_alarm(self::$time);
    }

    /**
    *添加任务
    public static function add($interval, $func, $argv,$persist =     false)
    {
        if(is_null($interval))
        {
            return;
        }
        $time = time()+$interval;
        self::$task[$time] = array('func'=>$func, 'argv'=>$argv, 'interval'=>$interval, 'persist'=>$persist);
    }

    /**
    *删除所有定时器任务
    */
    public function dellAll()
    {
        self::$task = array();
    }
}

现在,我知道了答案,尽管因为我还有其他工作要完成而已经过去了很多次...很抱歉 late.So 我的答案很简单。

sleep

适合阻塞进程,然后进程收到信号,而我错过的是永远不会捕获它...所以使用

pcntl_signal_dispatch

循环中的函数就是这样。