<?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]\n",
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;
}
}