注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

php开发lamp

《西安--木木》-经历丰富了生活。 架构师QQ群: 246695517

 
 
 

日志

 
 

延时环形任务执行(基于redis)  

2017-04-09 23:59:40|  分类: php应用 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
延时环形队列任务执行(基于redis)



<?php
/**
* Created by PhpStorm.
* User: lock
* Date: 2016/11/27
* Time: 22:25
*/
class timeQueue
{
private $redis;
private $task = array();
private $key;
/**
* timeQueue constructor.
*/
public function __construct(){
$conn = new Redis();
$conn->connect('127.0.0.1', 6379);
$conn->auth('123456');
$this->redis = $conn;
}
/**
* 添加一个任务:任务名,什么时候执行,参数array
* @param $name
* @param $args
* @param $time
*/
public function add_task($name,$args,$time) {
$this->key = $name;
$saveData = array('name'=>$name,'args'=>$args);
$members = json_encode($saveData);
$this->redis->zAdd( $this->key,time()+$time,$members);
}
/**
* 监听某个任务:任务名,执行该任务的函数
* @param $eventName
* @param $func
* @return bool
*/
public function listen_task($eventName, $func){
if(in_array($eventName,$this->task)){
return false;
}
$this->task[$eventName]=$func;
}
/**
* 移除一个存在的任务
* @param $eventName
*/
public function remove_task($eventName){
if(in_array($eventName,array_keys($this->task))){
unset($this->task[$eventName]);
}
}
/**
* 运行
*/
public function run(){
while (true) {
$result = $this->redis->zRange($this->key, 0, 0, true);
if (count($result) == 0){
usleep(500);
continue;
}

$scoreArr = array_values($result);
if($scoreArr[0]>time()){
usleep(500);
continue;
}
$itemArr = array_keys($result);

$v = $this->redis->zRem($this->key, $itemArr[0]);
if($v==false){
continue;
}
$data = json_decode($itemArr[0],1);
if(in_array($data['name'],array_keys($this->task))){
var_dump($this->key);
$this->task[$data['name']]($data['args']);
}
}
}
}
$obj = new timeQueue();
//添加任务并制定多少秒之后执行
$obj->add_task('aaa',[1,2],3);


$obj->add_task('demo',[1,2],2);
$obj->add_task('bug',[1,2],12);
$obj->add_task('aaa',[3,4],1);
$obj->add_task('aaa',[5,6],8);

// var_dump($obj->task);die;
//回调函数

$func = function ($args){
static $a=1;
++$a;
var_dump($a);
var_dump($args);

if($a>=1){
die;
}



};
//设置需要监听的任务
//$obj->listen_task('aaa',$func);
$obj->listen_task('demo',$func);
$obj->listen_task('bug',$func);
//移除一个已经注册了的任务
$obj->remove_task('bug');

$obj->run();



  评论这张
 
阅读(24)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017