在项目中我们经常遇到实时更新商品库存,一般解决方案是通过软件或服务器来定时执行任务。本文的DEMO中每隔60秒执行/Home/Index/crons。(ps:不是实时,而是当任何一个用户访问任何一个页面,只要下次访问时间超过60秒,便会执行该控制器方法)
官方的ThinkPHP/Library/Behavior/CronRunBehavior.class.php有bug,现已修改
<?php 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; } } if ($update) { \Think\Log::write(implode('', $log)); F('CRON_CONFIG', $crons); } } } }使用方法:
return array( 'app_begin' => array('Behavior\CronRunBehavior'), );3.Application\Common\Conf\config.php配置如下:
/* 自动运行配置 */ 'CRON_CONFIG_ON' => true, // 是否开启自动运行 'CRON_CONFIG' => array( '测试定时任务' => array('Home/Index/crons', '60', ''), //路径(格式同R)、间隔秒(0为一直运行)、指定一个开始时间 ),4.在Application\Home\Controller\IndexController.class.php里增加如下操作,以便测试
public function index() { $contents = file_get_contents("erdangjiade.txt"); $this->assign("contents", $contents); $this->display(); } public function crons() { file_put_contents("erdangjiade.txt", date("Y-m-d H:i:s") . "\r\n<br>", FILE_APPEND); // echo '执行任务定时任务!'; }提示: