TP5 定时任务扩展
浏览:26274
最后更新:2019-10-24 16:11
分类:类库
1. 将附件文件下载下来放入extend目录下
2. 创建一个THINKPHP定时任务文件 内容如下:
class Command extends \think\console\Command
{
protected function configure()
{
$this->setName('contrab')->setDescription('this is a mini contrab manager tool!');
}
protected function execute(Input $input, Output $output)
{
$contrab = new \contrab\Dispatcher(RUNTIME_PATH . '/contrab_cache/', APP_PATH . '/common/contrab/');
$contrab->addTask();
$contrab->boot();
}
}
\contrab\Dispatcher 第一个参数为任务的缓存目录 第二个参数为定时任务执行文件存放目录将其加入命令模式 通过SHELL脚本每一秒执行一次该命令,以下是SHELL脚本参考示例:
#!/bin/sh
step=1
for (( i = 0; i < 60; i=(i+step) ));
do
cd /wwwroot/
php think contrab
sleep $step
done
exit 0
将该shell加入WEB服务器所在的用户的crontab 里面* * * * * sh crontab.sh
那么定时任务整个环境就搭建完成!那么项目中需要加入定时任务的教程如下
在 定义的 contrab执行目录添加文件
比如在我上面定义的目录(APP_PATH . '/common/contrab/')里面添加Order.php文件 代码如下:
<?php
/**
* 创建者: 冰点阳光
* 创建时间: 2018-05-31
* 说明: 定时任务处理订单数据
*/
namespace app\common\contrab;
use contrab\ContrabAbstract;
use contrab\Times;
class Order extends ContrabAbstract
{
/**
* @var string 定时任务标识
*/
public $contrabName = 'order';
/**
* @var bool 是否终止
*/
public $isStop = false;
/**
* 设置定时任务时间执行规则
* @return Times|mixed
*/
public function setContrab()
{
$t = new Times(Times::NONE, 1);
$t->setStartTime('2018-06-05 00:00:30');
return $t;
}
/**
* 执行定时任务
* @return mixed|void
*/
public function _init()
{
$this->trace('the order contrab is init!');
}
public function trace($message)
{
$log = RUNTIME_PATH . '/'.date('Y_m_d') . '.log';
$write_message = '[' . date('Y-m-d H:i:s') . '] '.$message.PHP_EOL;
file_put_contents($log, $write_message, FILE_APPEND);
return true;
}
}
其中 contrabName 为 定时任务唯一标识 请确保唯一其中 isStop 默认为false 是否暂停任务 一般在中途定时任务需要停止但不方便删除整个文件那么将其设置为true那么下一个执行周期该定时任务将不会执行
setContrab() 该方法返回一个时间 new Times对象,
该对象实现两个参数, 第一个参数表示 频率 第二个参数标识步长
两个参数组合使用, 使用规则如下:
Times::SECOND 秒执行
Times::MINUTE 分钟执行
Times::HOUR 小时执行
Times::DAY 天执行
Times::NONE 按指定的 (setStartTime方法设置的时间)执行一次
以上参数搭配第二个参数 TIMES (步长) 表示每多少执行一次
比如
new Times(Times::SECOND, 10); 标识每十秒执行一次
其中new Times 对象里面 包含一个方法 setStartTime设置当前任务开始时间 请保证该方法参数格式为 Y-m-d H:i:s
比如
$t = new Times(Times::HOUR, 1);
$t->setStartTime('2018-06-05 00:30:00');
return $t;
表示 从 6月5日的凌点30分开始定时任务 每隔一个时辰执行一次 那么下一次执行的时间是 01:30分
希望我的表述还能够清楚,
该扩展 尚未经过严格测试,请慎重使用,如有更好代码 欢迎分享,部分代码感谢网络开源!
