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

如何在PHP中设置阻塞等待信号的进程,php,timer,process,blocking,Php,Timer,Process,Blocking,我正在使用一个信号编写一个计时器脚本。每1秒向进程发送一个SIGALRM,然后捕获该信号并检查进程是否有任务要执行。 我使用pcntl_报警(1)发送信号,但进程在收到信号之前执行并退出。 我想是否有一种方法来设置进程阻塞等待信号。我用过base_事件,但它太重了。 所以任何人都可以帮助我。非常感谢 这是我的剧本(对不起中国人): 现在,我知道答案了,尽管我有很多次都去世了,因为我还有其他工作要完成……很抱歉迟到了。所以我的答案很简单 睡眠 对于阻塞进程是正确的,然后进程接收到一个信号,而我错过

我正在使用一个信号编写一个计时器脚本。每1秒向进程发送一个SIGALRM,然后捕获该信号并检查进程是否有任务要执行。 我使用pcntl_报警(1)发送信号,但进程在收到信号之前执行并退出。 我想是否有一种方法来设置进程阻塞等待信号。我用过base_事件,但它太重了。 所以任何人都可以帮助我。非常感谢

这是我的剧本(对不起中国人):


现在,我知道答案了,尽管我有很多次都去世了,因为我还有其他工作要完成……很抱歉迟到了。所以我的答案很简单

睡眠

对于阻塞进程是正确的,然后进程接收到一个信号,而我错过的是永远不会捕获它…所以使用

pcntl_信号_调度


循环中的函数就是这样。

你能提供你尝试过的代码吗?使用php的
sleep
方法。请自己查看手册。我在说明中发布了代码,抱歉late@DocRattieI在代码中尝试过,但不起作用。我不知道为什么。@anantkumarsingh
<?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();
    }
}