# 计划任务


## 配置计划任务

安装完成后，在```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);
    }
}
 ```
 
 
