PHP计划任务完成!

PHP计划任务完成!

作者: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
0