ThinkPHP实现定时执⾏任务的两种⽅法
在平常的项⽬中我们总是会遇到需要将某个⽅法任务定时执⾏的问题,定时执⾏⽅法任务如果我们拥有服务器的权限,我们可以直接在服务器设置定时任务,例如在Windows的任务计划程序中进⾏设置,在Linux中编写脚本进⾏执⾏。如果我们没有服务器权限,我们该如何使⽤项⽬的程序代码来⾃动定时执⾏呢?接下来就为⼤家描述⼀个基于ThinkPHP框架定时执⾏任务的例⼦,具体的⽅法会在下⾯进⾏详细的描述。
关于定时执⾏任务在这⾥需要提醒的是, 这⾥描述的⽅法是被动执⾏的,也就是说当系统⽹站产⽣访问的时候,程序会对⽐是否达到定时的要求或者说是否达到执⾏任务的时间来决定是否执⾏⽅法任务,如果达到则执⾏,否则不执⾏。另外,如果⽹站没有任何访问和请求则也是同样不执⾏,如果⼤家有发现或者知道了如何主动执⾏定时任务,烦请留⾔告知,我也学习⼀下。
1、⽅法⼀:v3.2.1
①、ThinkPHP/Library/Behavior/CronRunBehavior.class.php⽂件
在这⾥⾸先要说的就是这个⾃动执⾏任务⽂件,官⽅所给的这个⽂件存在BUG,我是⽤的是v3.2.1版本,后⾯的版本是否有改正⼤家可以尝试⼀下。
<?php
/**
* =======================================
* Created by WeiBang Technology.
* Author: ZhiHua_W
* Date: 2016/9/22 0005
* Time: 上午 11:12
* Project: ThinkPHP实现定时执⾏任务
* Power: ⾃动执⾏任务
* =======================================
*/
namespace Behavior;
class CronRunBehavior
{
public function run(&$params)
{
if (C('CRON_CONFIG_ON')) {
$this->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;
php如何运行代码}
}
if ($update) {
\Think\Log::write(implode('', $log));
F('CRON_CONFIG', $crons);
}
}
}
}
此段代码已经将bug修复,⼤家可以将其复制到 “ ThinkPHP/Library/Behavior/CronRunBehavior.class.php ” ⽂件中进
⾏保存。
②、tgs.php
在Application/Common/Conf⽂件夹中新建tags.php⽂件,进⾏标签设置。
<?php
return array(
//'配置项'=>'配置值'
'app_begin' =>array('Behavior\CronRunBehavior'),
);
③、config.php
在Application/Common/Conf⽂件夹中的config.php⽂件进⾏⾃动运⾏配置。
<?php
return array(
/* ⾃动运⾏配置 */
'CRON_CONFIG_ON' => true, // 是否开启⾃动运⾏
'CRON_CONFIG' => array(
'测试执⾏定时任务' => array('Home/Index/crons', '5', ''), //路径(格式同R)、间隔秒(0为⼀直运⾏)、指定⼀个开始时间
),
);
④、IndexController.class.php
在Application/Home/Controller/IndexController.class.php⽂件中进⾏定时执⾏任务的编写。
<?php
/**
* =======================================
* Created by WeiBang Technology.
* Author: ZhiHua_W
* Date: 2016/9/22 0005
* Time: 上午 11:20
* Project: ThinkPHP实现定时执⾏任务
* Power: ⾃动执⾏任务⽅法控制器
* =======================================
*/
namespace Home\Controller;
use Think\Controller;
class IndexController extends Controller
{
/*
public function index(){
$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅⿊"; color: #333;} h1{ f
$this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅⿊"; color: #333;} h1{ f }
*/
public function index()
{
$contents = file_get_contents("");
//每次访问此路径将内容输出,查看内容的差别
var_dump($contents);
exit;
$this->assign("contents", $contents);
$this->display();
}
//定时执⾏的⽅法
public function crons()
{
//在⽂件中写⼊内容
file_put_contents("", date("Y-m-d H:i:s") . "执⾏定时任务!" . "\r\n<br>", FILE_APPEND);
}
}
这样定时执⾏任务我们就写好了,每隔5秒我们访问任何项⽬的url,然后查看根⽬录下的⽂件就会发现⾥⾯的内容变
化。
注意:当你修改间隔时间时会发现没有⽣效,这是你需要将Runtime/Data⽂件夹下的缓存⽂件删除,间隔时间缓存存放在
CRON_CONFIG.php⽂件中。
2、⽅法2:v3.2.2
此⽅法和⽅法⼀没有多⼤的区别。
①、tags.php
在/Application/Common/Conf⽬录下新建tags.php⽂件。(此和⽅法⼀处⼀样)
<?php
return array(
//'配置项'=>'配置值'
'app_begin' =>array('Behavior\CronRunBehavior'),
);
②、crons.php
在/Application/Common/Conf⽬录下新建crons.php⽂件。(此处和⽅法⼀有区别,注意区分。)
<?php
return array(
//myplan为我们计划定时执⾏的⽅法⽂件,2是间隔时间,nextruntime下次执⾏时间
//此⽂件位于/Application/Cron/⽬录下
'cron' => array('myplan', 2, nextruntime),
);
③、myplan.php
在/Application/Common/⽬录下新建 Cron⽂件夹,⾥⾯新建⽂件myplan.php⽂件。
<?php
echo date("Y-m-d H:i:s")."执⾏定时任务!" . "\r\n<br>";
此时我们就可以访问项⽬的url,然后我们会发现在Application/Runtime/⽬录下⽣成了~crons.php⽂件,⽂件内容如下:<?php
return array (
'cron' =>
array (
0 => 'myplan',
1 => 60,
2 => 1398160322,
),
);
>
这样就可以观察结果了!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论