thinkPHP3.2定时任务
前言
以下本文介绍的定时任务的方法是采用缓存的方式,访问才执行任务的!
定时任务
- 配置应用公共配置目录下新建crons.php
即在Application/Common/Conf/crons.php
return array(
'cronname'=>array('filename',intervals,nextruntime),
);
//cronname是任务名filename是任务文件名intervals间隔时间nextruntime下次执行时间
//例如
return array(
'cron_1'=>array('myplan',86400,1396195200),
);
//1396195200-2014年3月31日0时0分0秒开始执行任务
//86400每天执行一次
//执行的任务文件为myplan.php
//任务名为cron_1
- 新建任务文件,公共模块目录下新建Cron目录
该文件夹里面放执行任务的php处理文件。
- 添加行为扩展应用公共配置目录下配置tags.php
文件位置在:Application/Common/Conf/tags.php,如果没有这个文件可以新建一个。
return array (
'app_end' => array ('Behavior\CronRunBehavior'),
);
//app_end应用结束标签位,当然也可以是app_begin
附上CronRunBehavior的代码
<?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;
use Think\Behavior;
defined('THINK_PATH') or exit();
/**
* 自动执行任务
* @category Extend
* @package Extend
* @subpackage Behavior
* @author liu21st <liu21st@gmail.com>
*/
class CronRunBehavior extends Behavior {
protected $options = array(
'CRON_MAX_TIME' => 60, // 单个任务最大执行时间
);
public function run(&$params) {
// 锁定自动执行
$lockfile = RUNTIME_PATH.'cron.lock';
if(is_writable($lockfile) && filemtime($lockfile) > $_SERVER['REQUEST_TIME'] - C('CRON_MAX_TIME')) {
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(CONF_PATH.'crons.php')){
$crons = include CONF_PATH.'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 LIB_PATH.'Cron/'.$cron[0].'.php';
$_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 ;
}
}