ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
YurunPHP 1.3新加入了定时任务的功能,它可以定时执行一些操作,拥有高度自由的触发时间配置功能。当然这个定时是不一定准时的,下面会有说明。如果需要极其准确的定时任务,请使用Linux下的Cron或者Windows的计划任务功能。 > YurunPHP定时任务功能不推荐执行时间较长的任务! ### 原理解析 当用户访问时,判断上次执行时间和当前时间是否满足再次调用的条件,满足则调用,不满足则不调用。YurunPHP框架使用文件锁,保证同时只有一个请求会执行定时任务。预防并发同时执行、恶意攻击的情况。 ### 配置方法 #### 自动触发 在项目的Config目录下创建task.php文件,复制下面的内容 ~~~ return array( 'List' => array(), // 任务列表 'Status' => false, // 是否开启自动检测,默认为false 'ExecPercent' => 1, // 触发概率,0-1代表0%-100%,默认为1 'OnlyOnce' => false, // 是否只执行一个任务就结束,防止一个请求执行时间过长导致失败。默认为false ); ~~~ 如果需要自动触发需要在init.php中编写如下代码 ~~~ Event::register('YURUN_APP_LOAD_COMPLETE',function(){ // 启用任务 Task::init(); }); ~~~ #### 手动触发 在任意地方执行下面的语句 ~~~ Task::exec(); ~~~ ### 任务开发 1.在项目目录下创建Task文件夹 2.在Task文件夹下创建TestTask.class.php 3.在TestTask.class.php中为以下代码 ~~~ <?php class TestTask extends TaskBase { public static $name = '任务名称'; public static function exec() { // TODO: 任务操作 } } ~~~ 4.在配置文件task.php的List下加入 ~~~ 'Test' => array( // 触发事件条件1 array( 'StartTime' => 0, 'StopTime' => 0, 'Mode' => 0, 'Month' => 0, 'Day' => 0, 'Week' => 0, 'Hour' => 0, 'Minute' => 0, 'Second' => 0, 'Seconds' => 0, ), // 触发事件条件2 array( 'StartTime' => 0, 'StopTime' => 0, 'Mode' => 0, 'Month' => 0, 'Day' => 0, 'Week' => 0, 'Hour' => 0, 'Minute' => 0, 'Second' => 0, 'Seconds' => 0, ), ), ~~~ 上面的触发条件有需要可以无限增加,条件参数说明看下表: | 参数名 | 说明 | | --- | --- | | StartTime | 时间戳。任务允许执行的开始时间。可不设置。 | | StopTime | 时间戳。任务允许执行的结束时间。可不设置。 | | Mode | 条件判断模式。可不设置。看下面一个表格。 | | Month | 几月。可不设置。 | | Day | 几日。可不设置。 | | Week | 星期几,周一-周日=1-7。可不设置。 | | Hour | 小时。可不设置。 | | Minute | 分钟。可不设置。 | | Second | 秒数。可不设置。 | | Seconds | 间隔多少秒执行,Mode为MODE_SECOND时有效。 | #### Mode可选值表: | 参数名 | 说明 | | --- | --- | | Task::MODE_SECOND | 按秒执行 | | Task::MODE_EVERY_YEAR | 按每年执行 | | Task::MODE_EVERY_MONTH | 按每月执行 | | Task::MODE_EVERY_WEEK | 按每周执行 | | Task::MODE_EVERY_DAY | 按每日执行 | | Task::MODE_EVERY_HOUR | 按每小时执行 |