本文实例讲述了ThinkPHP框架实现定时执行任务的两种方法。分享给大家供大家参考,具体如下:
在平常的项目中我们总是会遇到需要将某个方法任务定时执行的问题,定时执行方法任务如果我们拥有服务器的权限,我们可以直接在服务器设置定时任务,例如在Windows的任务计划程序中进行设置,在Linux中编写脚本进行执行。如果我们没有服务器权限,我们该如何使用项目的程序代码来自动定时执行呢?接下来就为大家描述一个基于ThinkPHP框架定时执行任务的例子,具体的方法会在下面进行详细的描述。
关于定时执行任务在这里需要提醒的是, 这里描述的方法是被动执行的,也就是说当系统网站产生访问的时候,程序会对比是否达到定时的要求或者说是否达到执行任务的时间来决定是否执行方法任务,如果达到则执行,否则不执行。另外,如果网站没有任何访问和请求则也是同样不执行,如果大家有发现或者知道了如何主动执行定时任务,烦请留言告知,我也学习一下。
1、方法一:v3.2.1
①、PHP/Library/Behavior/CronRunBehavior.class.PHP文件
在这里首先要说的就是这个自动执行任务文件,官方所给的这个文件存在BUG,我是用的是v3.2.1版本,后面的版本是否有改正大家可以尝试一下。
rush:PHP;">
checkTime();
}
}
private function checkTime()
{
if (F('CRON_CONfig')) {
$crons = F('CRON_CONfig');
} else if (C('CRON_CONfig')) {
$crons = C('CRON_CONfig');
}
if (!empty($crons) && is_array($crons)) {
$update = false;
$log = array();
foreach ($crons as $key => $cron) {
if (empty($cron[2]) || $_SERVER['REQUEST_TIME'] > $cron[2]) {
G('cronStart');
R($cron[0]);
G('cronEnd');
$_useTime = G('cronStart','cronEnd',6);
$cron[2] = $_SERVER['REQUEST_TIME'] + $cron[1];
$crons[$key] = $cron;
$log[] = 'Cron:' . $key . ' Runat ' . date('Y-m-d H:i:s') . ' Use ' . $_useTime . ' s ' . "\r\n";
$update = true;
}
}
if ($update) {
\Think\Log::write(implode('',$log));
F('CRON_CONfig',$crons);
}
}
}
}
此段代码已经将bug修复,大家可以将其复制到 “ PHP/Library/Behavior/CronRunBehavior.class.PHP ” 文件中进行保存。
②、PHP
rush:PHP;">
'配置值'
'app_begin' =>array('Behavior\CronRunBehavior'),);
③、fig.PHP
rush:PHP;">
true,// 是否开启自动运行
'CRON_CONfig' => array(
'测试执行定时任务' => array('Home/Index/crons','5',''),//路径(格式同R)、间隔秒(0为一直运行)、指定一个开始时间
),);
④、PHP
在PHP文件中进行定时执行任务的编写。