zoukankan      html  css  js  c++  java
  • 定时器实现延时处理

    <?php
    /**
     * 定时器
     * User: wangdaxi
     * Date: 2018/3/2
     * Time: 上午10:53
     */
    set_time_limit(0);
    Newretail_Timer::run();
    while(true) {
        pcntl_signal_dispatch();
    }
    
    class Newretail_Timer
    {
        /**
         * @var array 任务数组
         */
        //可以把任务存储到redis里
        public static $task = [
            1 => [
                'uid' => 695,
                'uname' => '王大西'
            ],
            3 => [
                'uid' => 698,
                'uname' => '王3西'
            ],
            6 => [
                'uid' => 699,
                'uname' => '王6西'
            ],
            9 => [
                'uid' => 700,
                'uname' => '王9西'
            ],
        ];
    
        /**
         * @var int 环形队列的当前指针
         */
        public static $currentIndex = 0;
    
        /**
         * @var int 定时间隔
         */
        public static $time = 1;
    
        /**
         * @var string 任务记录
         */
        public static $taskRecord = '';
    
        /**
         * 开启服务
         * @param null $time
         */
        public static function run($time = null)
        {
            if (!is_null($time)) {
                self::$time = intval($time);
            }
    
            self::registerHandler();
    
            pcntl_alarm(self::$time);
        }
    
        /**
         * 注册信号处理函数
         */
        public static function registerHandler()
        {
            pcntl_signal(SIGALRM, ['Newretail_Timer', 'signalHandler']);
        }
    
    
        /**
         * 信号处理函数
         */
        public static function signalHandler()
        {
            //接收到信号,代表环指针移动一次
            self::$currentIndex++;
            if (self::$currentIndex > 59) {
                self::$currentIndex = 0;
            }
    
            self::task();
    
            //一次信号事件执行完成后,再触发下一次
            pcntl_alarm(self::$time);
        }
    
        /**
         * 执行任务处理
         */
        public static function task()
        {
    
    
            if (empty(self::$task)) {
                return false;
            }
    
    
            foreach (self::$task as $index => $arr) {
                if ($index != self::$currentIndex) {
                    continue;
                }
    
                //执行当前任务
                 $strRecord = sprintf(
                        "当前时间[%s],当前索引为[%s],用户信息为uid[%s],uname[%s]
    ",
                        date("Y-m-d H:i:s"),
                        $index,
                        $arr['uid'],
                        $arr['uname']
                    );
                echo $strRecord;
    
                self::recordTask($strRecord);
    
                //不删除当前任务
                //unset(self::$task[self::$currentIndex]);
            }
        }
    
        public static function recordTask($strRecord = "")
        {
            if (empty($strRecord)) {
                return false;
            }
            $fp = fopen("/tmp/recordtask", "a");
            fwrite($fp, $strRecord);
            fclose($fp);
            return true;
        }
    }
  • 相关阅读:
    document.URL 和 windows.location.href的区别
    毕向东udp学习笔记3多线程聊天
    毕向东udp学习笔记2
    毕向东udp学习笔记1
    udp 服务器界面监听
    android jni 总复习(转载)
    Android jni 编程4(对基本类型二维整型数组的操作)
    Android jni 编程3(对基本类型一维整型数组的操作)总结版
    Android jni 编程2(对基本类型一维整型数组的操作)
    Android jni 编程1(对基本类型字符串的操作)
  • 原文地址:https://www.cnblogs.com/hejun695/p/9104497.html
Copyright © 2011-2022 走看看