##3.6.1 擴展類庫:新型計劃任務
此擴展類型用于后臺計劃任務的調度,主要功能點有:
+ 1、提供了Redis/文件/數據庫三種MQ隊列
+ 2、提供了本地和遠程兩種調度方式
+ 3、以接口的形式實現計劃任務
+ 4、提供統一的crontab調度
更多內容,請查看:[[1.31] 新型計劃任務:以接口形式實現的計劃任務](/wikis/%5B1.31%5D-%E6%96%B0%E5%9E%8B%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1%EF%BC%9A%E4%BB%A5%E6%8E%A5%E5%8F%A3%E5%BD%A2%E5%BC%8F%E5%AE%9E%E7%8E%B0%E7%9A%84%E8%AE%A1%E5%88%92%E4%BB%BB%E5%8A%A1.html)
##3.6.2 安裝
###(1)內置擴展包
此安裝略,已內置于PhalApi框架中。
> 溫馨提示:
> PhalApi需要PhaApi 1.2.0及以上版本。
###(2)配置
我們需要在 **./Config/app.php** 配置文件中追加以下配置:
```javascript
/**
* 計劃任務配置
*/
'Task' => array(
//MQ隊列設置,可根據使用需要配置
'mq' => array(
'file' => array(
'path' => API_ROOT . '/Runtime',
'prefix' => 'phalapi_task',
),
'redis' => array(
'host' => '127.0.0.1',
'port' => 6379,
'prefix' => 'phalapi_task',
'auth' => '',
),
),
//Runner設置,如果使用遠程調度方式,請加此配置
'runner' => array(
'remote' => array(
'host' => 'http://library.phalapi.net/demo/',
'timeoutMS' => 3000,
),
),
),
```
以上內容看情況需要而配置。
###(3)數據庫表
當需要使用數據庫MQ列隊時,還需要將以下數據庫的配置追加到 **./Config/dbs.php** 中:
```javascript
'tables' => array(
//請將以下配置拷貝到 ./Config/dbs.php 文件對應的位置中,未配置的表將使用默認路由
//10張表,可根據需要,自行調整表前綴、主鍵名和路由
'task_mq' => array(
'prefix' => 'phalapi_',
'key' => 'id',
'map' => array(
array('db' => 'db_demo'),
array('start' => 0, 'end' => 9, 'db' => 'db_demo'),
),
),
)
```
同時,需要將 ./Data/phalapi_task_mq.sql 文件的SQL建表語句導入到你的數據庫。你也可以將利用腳本來生成。
##3.6.3 入門使用
###(1)加入MQ隊列
首先,我們需要在入口文件進行對Task的初始化:
```javascript
DI()->loader->addDirs('Library');
$mq = new Task_MQ_Redis(); //可以選擇你需要的MQ
DI()->taskLite = new Task_Lite($mq);
```
然后,這樣即可添加一個新的計劃任務到MQ:
```javascript
DI()->taskLite->add('Task.DoSth', array('id' => 1));
```
###(2)計劃任務的啟動
在啟動計劃任務前,我們需要編寫簡單的腳本,一如這樣:
```javascript
#!/usr/bin/env php
<?php
require_once '/path/to/Public/init.php';
DI()->loader->addDirs('Demo');
if ($argc < 2) {
echo "Usage: $argv[0] <service> \n\n";
exit(1);
}
$service = trim($argv[1]);
$mq = new Task_MQ_Redis();
$runner = new Task_Runner_Local($mq);
$rs = $runnter->go($service);
echo "\nDone:\n", json_encode($rs), "\n\n";
```
然后使用nohup或者crontab啟動即可。
###(3)續篇 - 統一的crontab計劃任務
上面第二點的啟動是通用、自定義、也是自由的啟動方式。
這里再提供一種具體的、統一的啟動方式,即使用crontab的方式。
首先,創建以下表(或見./Library/Task/Data/phalapi_task_progress.sql文件):
```javascript
CREATE TABLE `phalapi_task_progress` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT '' COMMENT '任務標題',
`trigger_class` varchar(50) DEFAULT '' COMMENT '觸發器類名',
`fire_params` varchar(255) DEFAULT '' COMMENT '需要傳遞的參數,格式自定',
`interval_time` int(11) DEFAULT '0' COMMENT '執行間隔,單位:秒',
`enable` tinyint(1) DEFAULT '1' COMMENT '是否啟動,1啟動,0禁止',
`result` varchar(255) DEFAULT '' COMMENT '運行的結果,以json格式保存',
`state` tinyint(1) DEFAULT '0' COMMENT '進程狀態,0空閑,1運行中,-1異常退出',
`last_fire_time` int(11) DEFAULT '0' COMMENT '上一次運行時間',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
```
接著,添加crontab計劃任務:
```javascript
$ crontab -e
*/1 * * * * /usr/bin/php /path/to/PhalApi/Library/Task/crontab.php >> /tmp/phalapi_task_crontab.log 2>&1
```
然后,實現你的計劃任務服務接口:
```javascript
<?php
class Api_Task_Demo extends PhalApi_Api {
public function doSth() {
// ...
}
}
```
最后,配置計劃任務:
```javascript
INSERT INTO `phalapi_task_progress`(title, trigger_class, fire_params, interval_time) VALUES('你的任務名字', 'Task_Progress_Trigger_Common', 'Task_Demo.DoSth&Task_MQ_File&Task_Runner_Local', '300');
```
注意,在配置時,需要指明MQ和Runner的類型。
##3.6.4 更多說明
###(1)依賴的資源服務
名稱|類|沒有時是否自動創建
---|---|---
curl|PhalApi_CUrl|是
request|PhalApi_Request|強制每次初始化,用于本地調度時
response|PhalApi_Response_Json|強制每次初始化,用于本地調度時
###(2)MQ
####Redis MQ隊列
Redis MQ隊列需要的配置為:
```javascript
'Task' => array(
//MQ隊列設置,可根據使用需要配置
'mq' => array(
'redis' => array(
'host' => '127.0.0.1',
'port' => 6379,
'prefix' => 'phalapi_task',
'auth' => '',
),
),
),
```
其中:
選項|是否必須|默認值|說明
---|---|---|---
host|否|127.0.0.1|redis的HOST
port|否|6379|redis的端口
prefix|否|phalapi_task|key的前綴
auth|否||redis的驗證,不為空時執行驗證
可以這樣創建Redis MQ隊列:
```javascript
//方法一:使用app.Task.mq.redis配置
$mq = new Task_MQ_Redis();
//方法二:外部依賴注入
$redisCache = new PhalApi_Cache_Redis(array('host' => '127.0.0.1'));
$mq = new Task_MQ_Redis($redisCache);
```
####文件MQ隊列
文件MQ需要的配置為:
```javascript
'Task' => array(
//MQ隊列設置,可根據使用需要配置
'mq' => array(
'file' => array(
'path' => API_ROOT . '/Runtime',
'prefix' => 'phalapi_task',
),
),
),
```
其中:
選項|是否必須|默認值|說明
---|---|---|---
path|否|API_ROOT/Runtime|緩存的文件目錄
prefix|否|phalapi_task|key的前綴
可以這樣創建文件MQ隊列:
```javascript
//方法一:使用app.Task.mq.file配置
$mq = new Task_MQ_File();
//方法二:外部依賴注入
$fileCache = new PhalApi_Cache_File(array('path' => '/tmp/cache'));
$mq = new Task_MQ_File($fileCache);
```
####數據庫MQ隊列
數據庫MQ隊列需要的配置為:
```javascript
'tables' => array(
//請將以下配置拷貝到 ./Config/dbs.php 文件對應的位置中,未配置的表將使用默認路由
//10張表,可根據需要,自行調整表前綴、主鍵名和路由
'task_mq' => array(
'prefix' => 'phalapi_',
'key' => 'id',
'map' => array(
array('db' => 'db_demo'),
array('start' => 0, 'end' => 9, 'db' => 'db_demo'),
),
),
)
```
可以這樣創建數據庫MQ隊列:
```javascript
$mq = new Task_MQ_DB();
```
####數組MQ隊列
數組MQ隊列是將MQ存放在PHP的數組里面,用于單元測試或者是一次性、臨時性的計劃任務調度。
可以這樣創建數據庫MQ隊列:
```javascript
$mq = new Task_MQ_Array();
```
###(3)本地和遠程調度
####本地調度的創建
```javascript
$runner = new Task_Runner_Local($mq, 10); //10表示每批次彈出10個進行處理
```
需要注意的是,每次執行一個計劃任務,都會重新初始化必要的DI資源服務。
且此調度方式不能用于接口請求時的同步調用。
####遠程調度的創建
首先需要以下配置:
```javascript
/**
* 計劃任務配置
*/
'Task' => array(
//Runner設置,如果使用遠程調度方式,請加此配置
'runner' => array(
'remote' => array(
'host' => 'http://library.phalapi.net/demo/',
'timeoutMS' => 3000,
),
),
),
```
其中:
選項|是否必須|默認值|說明
---|---|---|---
host|是||接口域名鏈接
timeoutMS|否|3000|接口超時時間,單位毫秒
可以這樣創建:
```javascript
//使用默認的連接器 - HTTP + POST的方式
$runner = new Task_Runner_Remote($mq, 10); //10表示每批次彈出10個進行處理
//或者,指定連接器
$connector = new Task_Runner_Remote_Connector_Impl();
$runner = new Task_Runner_Remote($mq, 10, $connector); //10表示每批次彈出10個進行處理
```
- 歡迎使用PhalApi!
- 接口,從簡單開始!
- [1.1]-下載與安裝
- [1.2]-創建一個自己的項目
- [1.3]-在線體驗
- [1.4]-文檔、幫助和官網
- [1.10]-對PhalApi框架的抉擇
- [1.11]-快速入門(backup)
- [1.12]-參數規則:接口參數規則配置
- [1.13]-統一的接口請求方式:_sevice=XXX.XXX
- [1.14]-統一的返回格式和結構:ret-data-msg
- [1.15]-數據庫操作:基于NotORM的使用及優化
- [1.16]-配置讀取:內外網環境配置的完美切換
- [1.17]-日記紀錄:簡化版的日記接口
- [1.18]-快速函數:人性化的關懷
- [1.19]-DI服務速查:各資源服務一覽表
- [1.20]-DB操作:數據庫基本操作速查
- [1.21]-類的自動加載:遵循PEAR包的命名規范
- [1.22]-簽名驗證:自定義簽名規則
- [1.23]-請求和響應:GET和POST兩者皆可得及超越JSON格式返回
- [1.24]-緩存策略:更靈活地可配置化的多級緩存
- [1.25]-國際化翻譯:為走向國際化提前做好翻譯準備
- [1.26]-數據安全:數據對稱加密方案
- [1.27]-精益開發:更富表現力的Model層和重量級數據獲取的應對方案
- [1.28]-COOKIE:對COOKIE原生態的支持及記憶加密升級版
- [1.29]-開放與封閉:多入口和統一初始化
- [1.30]-保持的力量:接口開發最佳實踐
- [1.31]-新型計劃任務:以接口形式實現的計劃任務
- [2.11]-核心思想:DI依賴注入-讓資源更可控
- [2.12]-海量數據:可配置的分庫分表
- [2.13]-接口調試:在線SQL語句查看與性能優化
- [2.14]-測試驅動開發:意圖導向編程下的接口開發
- [2.15]-演進:新型計劃任務續篇
- [2.16]-領域驅動設計:應對復雜領域業務的Domain層
- [2.17]-微服務:Api接口服務層
- [2.18]-定制化:資源服務的再實現
- [2.19]-擴展庫:可重用的擴展類庫
- [2.20]-約定編程:架構明顯的編程風格
- [2.21]-服務器統一部署方案簡明版:CentOs---Nginx---php-fpm---MySql-[--Memcached]
- [2.22]-更多工具:精益項目和團隊建設
- [3.1]-擴展類庫:微信開發
- [3.2]-擴展類庫:代理模式下phprpc協議的輕松支持
- [3.3]-擴展類庫:基于PHPMailer的郵件發送
- [3.4]-擴展類庫:優酷開放平臺接口調用
- [3.5]-擴展類庫:七牛云存儲接口調用
- [3.6]-擴展類庫:新型計劃任務
- [3.8]-擴展類庫:用戶、會話和第三方登錄集成
- [3.9]-擴展類庫:swoole支持下的長鏈接和異步任務實現
- [3.11]-擴展類庫:基于FastRoute的快速路由
- [4.2]-開發實戰2:模擬優酷開放平臺接口項目開發
- [4.3]-開發實戰3:一個簡單的小型項目開發(奔跑吧兄弟投票活動)
- [5.1]-架構與思想:PhalApi核心設計和思想解讀
- [5.2]-雜談:扯一些PhalApi的前世和今生
- [5.3]-框架總結:術語表和PHP開發建議
- [5.4]-許可
- [5.5]-聯系和加入我們
- [5.6]-更新日記
- [5.8]-致框架貢獻者:加入PhalApi開源指南
- [6.1]-基于接口查詢語言的SDK包
- [6.2]-SDK包(JAVA版)
- [6.3]-SDK包(PHP版)
- [6.4]-SDK包(Objective-C版)
- [6.5]-SDK包(javascript版)
- [6.6]-SDK包(Ruby版)
- [8.1]-PhalApi視頻教程
- 附錄1:接口文檔參考模板