如何设置阻止等待PHP中信号的procss

时间:2015-05-29 08:27:03

标签: php timer process blocking

我正在编写一个Timer脚本,使用一个信号。每1秒发送一个SIGALRM到进程,然后捕获信号并检查是否有任务要做。 我使用pcntl_alarm(1)发送信号,但是在接收信号之前,进程是excute-and-quit。 我认为是否有一种方法来设置阻止等待信号的prcess。我使用了base_event,但它的重量很大。 所以任何人都可以帮助我。非常感谢。

那是我的剧本(抱歉中文^ _ ^):

<?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();
    }
}

1 个答案:

答案 0 :(得分:0)

现在,我知道答案,即使已经过了很多次因为我有其他工作要完成...对不起已经很晚了。所以我的回答非常简单。

  

睡眠

适用于阻止某个进程,然后该进程会收到一个信号,我错过的内容永远不会捕获它...所以请使用

  

pcntl_signal_dispatch

循环中的

功能正是如此。