如何在 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
循环中的函数就是这样。
我正在编写一个计时器脚本,使用 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
循环中的函数就是这样。