--begin by itlife365
how thinkphp-auto-execute-cron
thinkphp如何使用添加定时任务? CronRunBehavior.class.php如何使用?
在thinkphp中很多接口都集成了,配置thinkphp php定时任务跟我走
0.首先,你的的服务器支持cron定时任务的功能
1.添加定时任务行为文件CronRunBehavior.class.php,请检查你的项目文件夹下ThinkPHP\Extend\Behavior\CronRunBehavior.class.php是否有文件存在,如果不存在请到thinkphp官网下载。或者在这边下载,我的版本是3.1.3 。
查看环境变量的值,如果不知道变量的值:可以在方法里面输出以便查看:
比如:
echo "EXTEND_PATH=".EXTEND_PATH;
echo "<br/>CONF_PATH=".CONF_PATH;
echo "<br/>LIB_PATH=".LIB_PATH;
***输出:
EXTEND_PATH=D:\mysoft\APMServ5.2.6\www\htdocs\mycollect\ThinkPHP/Extend/
CONF_PATH=./Home/Conf/
LIB_PATH=./Home/Lib/
下载后配置入口文件定义的扩展文件目录,比如:define('EXTEND_PATH', APP_PATH . 'ThinkPHP/Extend/');
所以定时任务行为文件拷贝至:myapp/ThinkPHP/Extend/Behavior/CronRunBehavior.class.php
2.在Config目录下定义任务配置文件crons.php(注意此名称为硬编码(被写死了),名称必须是crons.php)
这个定时任务配置文件之所以要这么配置,可参考CronRunBehavior.class.php源码得知:
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';
}
另外,这里的Config目录,默认是项目下的Config目录,默认指定方式的源码是:
defined('CONF_PATH') or define('CONF_PATH',APP_PATH.'Conf/'); // 项目配置目录
如果我们在入口文件index.php有指定的配置目录,则应是入口文件定义的目录:
比如:
define('CONF_PATH', 'myapp/Config/');
文件crons.php的内容格式如下:
return array(
'cronname'=>array('filename',intervals,nextruntime),...
);
*参数说明如下:
* cronname是任务名称,主要是日志记录使用,好知道执行了哪些任务
* filename是脚本文件名,默认放在Lib/Cron/下面,
为什么规定放到这个目录,可参考CronRunBehavior.class.php源码:
include LIB_PATH.'Cron/'.$cron[0].'.php';
即解析常量LIB_PATH 项目类库目录 为:include 'myapp/Home/Lib/Cron/filename.php';
#常量LIB_PATH 项目类库目录 默认值 APP_PATH.'Lib/'
#filename.php 里面可编写一些需要执行的代码。如自动完成一些数据修改等。
* intervals是任务执行间隔时间,UNIX时间戳类型
* nextruntime是第一次或下一次执行时间 UNIX时间戳类型
3.thinkphp如何启动定时任务呢?
因为CronRunBehavior.class.php 是thinkphp的行为的一种,必须通过某一种行为方式促发才能执行。
这里我们通过Thinkphp核心包目录Conf/tags.php来配置。
在tags.php里面,我们配置这个选项:'action_begin' => array('CronRun',),
当任何用户访问我们的项目时,必然会先执行action。即促发一个action_begin行为。
这个行为会找到CronRunBehavior.class.php这个文件,并执行里面的run方法。
建议使用者读下这个run方法的执行逻辑。
总结:CronRunBehavior.class.php的定时任务执行并不是精准的,它必须通过行为来促发。
即,如果没有用户访问我们的APP。 那定时任务就不会被促发,也就是说我们设置的intervalsTime时间,是最小间隔时间。当用户访问我们的APP的时间超过上次定时任务执行的时间差大于intervalsTime时,
才会促发定时任务的实际执行。
//其实CronRunBehavior并没有真正放到后台去执行,还是得依赖用户刷新操作来触发,如果是一个执行时间比较长的任务,就会影响到用户的体验了。
//use Think\Log;
// 记录Cron执行日志
//Log::write(implode('',$log)); default
\Think\Log::write(implode('',$log));//ljs
转载请注明出处。
thinkphp-auto-execute-cron
--end by itlife365.com