作者:LAMP小白 点击:1849 发布日期:2012-10-23 17:16:00 返回列表
项目需要定时更新新浪微博中某些文章的回复和转发数,经过5个多小时的努力,终于做出来了!!
其他的代码就不放了,这是最核心的部分
mio_lt;?php //这个程序长期执行 ignore_user_abort(); set_time_limit(0); class Action { protected $last_update_time = 0; protected $last_update_line = 0; protected $article_count = 0; //当前偏移量 public $limit = 0; //一次更新多少条 public $getNum = 1; //唤醒 public function wakeup() { //检查授权 $user_id = get_user_id(); if(empty($user_id)){ $this-mio_gt;log('8','0'); $this-mio_gt;killall(); exit(); } //检查运行锁 $run = _uri('article_control', array('type'=mio_gt;'4'), 'val'); //判断运行状态 if(empty($run) || $run == '0'){ $this-mio_gt;killall(); exit(); } //复位数据 $this-mio_gt;limit = 0; AnSinaweibo::checkWeibo(); //更新最后运行时间 _model('article_control')-mio_gt;update(array('type'=mio_gt;'1'), array('val'=mio_gt;time())); //更新程序运行状态 $status = _uri('article_control', array('type'=mio_gt;'2'), 'val'); if(!($status == 'working')){ _model('article_control')-mio_gt;update(array('type'=mio_gt;'2'), array('val'=mio_gt;'working')); } //增加数量 _model('article_control')-mio_gt;update(array('type'=mio_gt;'3'), 'SET val = val + 1'); //写日志 $this-mio_gt;log('1','1'); //启动 $this-mio_gt;update_start(); } //执行更新 protected function update_start() { //根据总数执行循环 while($this-mio_gt;limit mio_lt;= $this-mio_gt;article_count){ //检查运行锁 $run = _uri('article_control', array('type'=mio_gt;'4'), 'val'); //判断运行状态 if(empty($run) || $run == '0'){ $this-mio_gt;killall(); exit(); } //根据偏移量取出数据 $r = _model('article')-mio_gt;getFields('weibo_id', array('id mio_gt;'=mio_gt;'0'), 'ORDER BY id DESC LIMIT '.$this-mio_gt;limit.','.$this-mio_gt;getNum); if($r){ //获取数据 $result = AnSinaweibo::getWeibo_RtComment($r); //获取失败或有错 不更新比错误的更新好 跳出 if(empty($result) || !empty($result['error'])){ continue; } foreach($result as $k =mio_gt; $v){ //获取计数表中这篇文章的信息 $article_id = _uri('article', array('weibo_id'=mio_gt;$v['id']), 'id'); $article_info = _uri('article_stat', array('article_id'=mio_gt;$article_id)); //没有查询到 跳出 if(empty($article_info)){ continue; } $filter = array(); if(!($v['comments'] == $article_info['comment_num'])){ $filter['comment_num'] = $v['comments']; } if(!($v['reposts'] == $article_info['rt_num'])){ $filter['rt_num'] = $v['reposts']; } //如果数据无变化则跳出 if(empty($filter)){ continue; } //有变化才更新 _model('article_stat')-mio_gt;update(array('article_id'=mio_gt;$article_info['article_id']), $filter); } } //偏移量增加 $this-mio_gt;limit = $this-mio_gt;limit + $this-mio_gt;getNum; //写日志 $this-mio_gt;log('2','1',$this-mio_gt;limit); //休息10秒 sleep(10); } //顺利完成后 写日志退出 $this-mio_gt;log('4','1'); $this-mio_gt;sucess(); } //初始化更新表 protected function init() { //有最后更新时间的信息吗? if(empty($this-mio_gt;last_update_time)){ _model('article_control')-mio_gt;create(array('type'=mio_gt;'1', 'val'=mio_gt;'1')); } //有最后更新行数的信息吗? if(empty($this-mio_gt;last_update_line)){ _model('article_control')-mio_gt;create(array('type'=mio_gt;'2', 'val'=mio_gt;'done')); } //写日志 $this-mio_gt;log('9','1'); } public function start() { //增加子程序 _model('article_control')-mio_gt;update(array('type'=mio_gt;'3'), 'SET val = val + 1'); //更新数据 $this-mio_gt;last_update_time = _uri('article_control', array('type'=mio_gt;'1'), 'val'); $this-mio_gt;last_update_line = _uri('article_control', array('type'=mio_gt;'2'), 'val'); $run = _uri('article_control', array('type'=mio_gt;'4'), 'val'); $this-mio_gt;article_count = _uri('site_stat', array('id'=mio_gt;'2'), 'value'); //判断运行状态 if(empty($run) || $run == '0'){ $this-mio_gt;killall(); exit(); } //判断数据是否完整 if(empty($this-mio_gt;last_update_time) || empty($this-mio_gt;last_update_line) || empty($this-mio_gt;article_count)){ $this-mio_gt;init(); } //判断是否需要启动 $this-mio_gt;sucess(); } //守护进程 public function sleep() { while(true){ //更新数据 $this-mio_gt;last_update_time = _uri('article_control', array('type'=mio_gt;'1'), 'val'); $this-mio_gt;last_update_line = _uri('article_control', array('type'=mio_gt;'2'), 'val'); $run = _uri('article_control', array('type'=mio_gt;'4'), 'val'); $this-mio_gt;article_count = _uri('site_stat', array('id'=mio_gt;'2'), 'value'); $this-mio_gt;log('6','1'); //判断运行状态 if(empty($run) || $run == '0'){ $this-mio_gt;killall(); exit(); } //判断数据是否完整 if(empty($this-mio_gt;last_update_time) || empty($this-mio_gt;last_update_line) || empty($this-mio_gt;article_count)){ $this-mio_gt;init(); } //判断是否需要启动 if(time() - $this-mio_gt;last_update_time mio_gt; 3600){ $this-mio_gt;wakeup(); } else { sleep(60); } } } //成功完成退出 public function sucess() { //更新最后运行时间 _model('article_control')-mio_gt;update(array('type'=mio_gt;'1'), array('val'=mio_gt;time())); //更新程序运行状态 $status = _uri('article_control', array('type'=mio_gt;'2'), 'val'); if(!($status == 'sleep')){ _model('article_control')-mio_gt;update(array('type'=mio_gt;'2'), array('val'=mio_gt;'sleep')); } //减少数量 _model('article_control')-mio_gt;update(array('type'=mio_gt;'3'), 'SET val = val - 1'); //写日志 $this-mio_gt;log('4','1'); //启动守护进程 $this-mio_gt;sleep(); } //强制退出 public function killall() { //关闭所有运行的子程序 $run = _uri('article_control', array('type'=mio_gt;'4'), 'val'); if(!($run == '0')){ _model('article_control')-mio_gt;update(array('type'=mio_gt;'4'), array('val'=mio_gt;'0')); } //更新最后运行时间 _model('article_control')-mio_gt;update(array('type'=mio_gt;'1'), array('val'=mio_gt;time())); //更新程序运行状态 $status = _uri('article_control', array('type'=mio_gt;'2'), 'val'); if(!($status == 'abort')){ _model('article_control')-mio_gt;update(array('type'=mio_gt;'2'), array('val'=mio_gt;'abort')); } //减少数量 _model('article_control')-mio_gt;update(array('type'=mio_gt;'3'), array('val'=mio_gt;'0')); //写日志 $this-mio_gt;log('3','1'); ignore_user_abort(false); exit(); } //解除锁定 public function unlock() { $lock = _uri('article_control', array('type'=mio_gt;'4'), 'val'); if($lock == '0'){ _model('article_control')-mio_gt;update(array('type'=mio_gt;'4'), array('val'=mio_gt;'1')); } $this-mio_gt;log('7','1'); exit(); } //写日志 //1 开始首次更新 2 继续执行更新 3 程序退出 4成功完成 8启动 9 初始化 protected function log($action = NULL, $result = NULL, $limit = NULL) { if($action == NULL || $result == NULL) return false; $limit = $limit ? $limit : 0; return _model('article_log')-mio_gt;create(array('action'=mio_gt;$action, 'result'=mio_gt;$result, 'limit'=mio_gt;$limit)); } } ?mio_gt;
上一篇:表创建(上) 下一篇:快递查询API