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

标签 php timer process blocking

我正在编写一个计时器脚本,使用一个信号。每 1 秒向进程发送一个 SIGALRM,然后捕获信号并检查是否有任务要做。 我使用 pcntl_alarm(1) 发送信号,但是在接收信号之前进程执行并退出。 我想是否有一种方法可以设置阻塞等待信号的进程。我已经使用了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();
    }
}

最佳答案

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

sleep

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

pcntl_signal_dispatch

循环中的函数正是这种方式。

关于php - 如何在 PHP 中设置阻塞等待信号的进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30524755/

相关文章:

php - IE 在第二次中未获取($.get()) 新数据

php - 无法将 LIKE 与 GROUP BY 一起使用

c - 在c中打印更新变量

Android - 每 5 秒循环部分代码

python - 如何使用python获取进程的pid

python - 如何在 Python 中运行不可见的子进程?

php - 从 PHP-CPP 的 Php::Value 中检索类名

php - Retrofit v2.0.0-beta2 如何使用 RequestBody 上传文件

java - 使用 android TimerTask 和 Timer 防止最终用户操纵计时器

c++ - CreateRemoteThread失败,可能目标进程中的lpBaseAddress无效,但它是系统分配的?