78 lines
2.5 KiB
Markdown
78 lines
2.5 KiB
Markdown
# 计划任务
|
||
|
||
|
||
## 配置计划任务
|
||
|
||
安装完成后,在```pp_task_progress```表可以看到全部的计划任务。
|
||
|
||
通过管理后台或者后台接口或者数据库```pp_task_progress```表,可以配置和维护计划任务。
|
||
|
||
## 执行计划任务
|
||
|
||
完成上述的计划任务配置后,有两种方式可以执行计划任务。一种是常规的定时执行,另一种是人工通过MQ触发执行。
|
||
|
||
需要注意的是,
|
||
+ 1)通过crontab定时任务执行时,会存在一定的延时(1分钟左右,视具体任务执行时间而定),不能严格保证按配置的时间点执行
|
||
+ 2)通过MQ触发执行时,默认采用的是数据库MQ实现,如果需要支持高并发,需要先切换到Redis MQ(在./config/di.php把MQ改为```\PhalApi\Task\MQ\RedisMQ```)
|
||
|
||
### 定时执行计划任务
|
||
|
||
通过配置,可以定时执行计划任务。
|
||
|
||
在Linux系统上,通过```crontab -e```修改添加计划任务:
|
||
```
|
||
# PhalApi专业版计划任务
|
||
*/1 * * * * php /path/to/bin/run_task.php > /dev/null
|
||
```
|
||
|
||
如果需要手动执行或进行测试,可以进入专业版根目录,然后运行脚本命令:
|
||
```
|
||
$ php ./bin/run_task.php
|
||
```
|
||
|
||
### 通过MQ手动执行计划任务
|
||
|
||
通过MQ,可以在API接口中(即同步请求中),把耗时严重或者执行资源过多的请求,改为异步的后台执行。实现代码是:
|
||
```php
|
||
$taskDomain = new \Base\Domain\Task();
|
||
$taskDomain->push('App.Task.Demo', array('str' => '传递给计划任务的接口参数'));
|
||
```
|
||
|
||
默认MQ是采用数据库存储,添加到MQ后,系统将会在1分钟内消费。
|
||
|
||
## 如何编写计划任务接口
|
||
|
||
编写计划任务的接口,和普通的前台接口类似,区别在于:
|
||
|
||
- 1、计划任务用于后台运行,通过调度器采用CLI方式执行
|
||
- 2、计划任务没有上下文信息,如果需要指定uid或者app_key,请手动添加接口参数
|
||
- 3、计划任务接口,推荐统一放置在```Task.*.*```里面
|
||
|
||
以下是一个计划任务示例代码:
|
||
```php
|
||
<?php
|
||
namespace Task\Api;
|
||
use App\Task\Api;
|
||
|
||
class Demo extends Api {
|
||
|
||
public function getRules() {
|
||
return array(
|
||
'demo' => array(
|
||
'str' => array('name' => 'str', 'default' => '示例参数'),
|
||
),
|
||
);
|
||
}
|
||
|
||
/**
|
||
* 计划任务接口-示例
|
||
* @return string str 接收到的参数
|
||
*/
|
||
public function run() {
|
||
return array('str' => $this->str);
|
||
}
|
||
}
|
||
```
|
||
|
||
|