CronRunBehavior.class.php 2.59 KB
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK IT ]
// +----------------------------------------------------------------------
// | Copyright (c) 2009 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------
namespace Behavior;

/**
 * 自动执行任务
 */
class CronRunBehavior
{

    public function run(&$params)
    {
        // 锁定自动执行
        $lockfile = RUNTIME_PATH . 'cron.lock';
        if (is_writable($lockfile) && filemtime($lockfile) > $_SERVER['REQUEST_TIME'] - C('CRON_MAX_TIME', null, 60)) {
            return;
        } else {
            touch($lockfile);
        }
        set_time_limit(1000);
        ignore_user_abort(true);
        // 载入cron配置文件
        // 格式 return array(
        // 'cronname'=>array('filename',intervals,nextruntime),...
        // );
        if (is_file(RUNTIME_PATH . '~crons.php')) {
            $crons = include RUNTIME_PATH . '~crons.php';
        } elseif (is_file(COMMON_PATH . 'Conf/crons.php')) {
            $crons = include COMMON_PATH . 'Conf/crons.php';
        }
        if (isset($crons) && is_array($crons)) {
            $update = false;
            $log = array();
            foreach ($crons as $key => $cron) {
                if (empty($cron[2]) || $_SERVER['REQUEST_TIME'] >= $cron[2]) {
                    // 到达时间 执行cron文件
                    G('cronStart');
                    include COMMON_PATH . 'Cron/' . $cron[0] . '.php';
                    G('cronEnd');
                    $_useTime = G('cronStart', 'cronEnd', 6);
                    // 更新cron记录
                    $cron[2] = $_SERVER['REQUEST_TIME'] + $cron[1];
                    $crons[$key] = $cron;
                    $log[] = "Cron:$key Runat " . date('Y-m-d H:i:s') . " Use $_useTime s\n";
                    $update = true;
                }
            }
            if ($update) {
                // 记录Cron执行日志
                \Think\Log::write(implode('', $log));
                // 更新cron文件
                $content = "<?php\nreturn " . var_export($crons, true) . ";\n?>";
                file_put_contents(RUNTIME_PATH . '~crons.php', $content);
            }
        }
        // 解除锁定
        unlink($lockfile);

        return;
    }
}