thinkphp如何使用添加定时任务? CronRunBehavior.class.php如何使用?

--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

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年4月    »
123456
78910111213
14151617181920
21222324252627
282930
搜索
标签列表
网站分类
最新留言
    文章归档
    友情链接

    Powered By Z-BlogPHP 1.7.3

    Copyright Your WebSite.Some Rights Reserved.闽ICP备11018667号-2