新型計劃任務

2018-11-21 21:32 更新

3.6.1 擴展類庫:新型計劃任務

此擴展類型用于后臺計劃任務的調(diào)度,主要功能點有:

  • 1、提供了Redis/文件/數(shù)據(jù)庫三種MQ隊列
  • 2、提供了本地和遠程兩種調(diào)度方式
  • 3、以接口的形式實現(xiàn)計劃任務
  • 4、提供統(tǒng)一的crontab調(diào)度

更多內(nèi)容,請查看:[1.31] 新型計劃任務:以接口形式實現(xiàn)的計劃任務

3.6.2 安裝

(1)內(nèi)置擴展包

此安裝略,已內(nèi)置于PhalApi框架中。

溫馨提示:
PhalApi需要PhaApi 1.2.0及以上版本。

(2)配置

我們需要在 ./Config/app.php 配置文件中追加以下配置:

    /**
     * 計劃任務配置
     */
    'Task' => array(
        //MQ隊列設置,可根據(jù)使用需要配置
        'mq' => array(
            'file' => array(
                'path' => API_ROOT . '/Runtime',
                'prefix' => 'phalapi_task',
            ),
            'redis' => array(
                'host' => '127.0.0.1',
                'port' => 6379,
                'prefix' => 'phalapi_task',
                'auth' => '',
            ),
            'mc' => array(
                'host' => '127.0.0.1',
                'port' => 11211,
            ),
        ),

        //Runner設置,如果使用遠程調(diào)度方式,請加此配置
        'runner' => array(
            'remote' => array(
                'host' => 'http://library.phalapi.net/demo/',
                'timeoutMS' => 3000,
            ),
        ),
    ),

以上內(nèi)容看情況需要而配置。

(3)數(shù)據(jù)庫表

當需要使用數(shù)據(jù)庫MQ列隊時,還需要將以下數(shù)據(jù)庫的配置追加到 ./Config/dbs.php 中:

    'tables' => array(

    //請將以下配置拷貝到 ./Config/dbs.php 文件對應的位置中,未配置的表將使用默認路由

        //10張表,可根據(jù)需要,自行調(diào)整表前綴、主鍵名和路由
        '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建表語句導入到你的數(shù)據(jù)庫。你也可以將利用腳本來生成。

3.6.3 入門使用

(1)加入MQ隊列

首先,我們需要在入口文件進行對Task的初始化:

DI()->loader->addDirs('Library');
$mq = new Task_MQ_Redis();  //可以選擇你需要的MQ
DI()->taskLite = new Task_Lite($mq);

然后,這樣即可添加一個新的計劃任務到MQ:

DI()->taskLite->add('Task.DoSth', array('id' => 1));

(2)計劃任務的啟動

在啟動計劃任務前,我們需要編寫簡單的腳本,一如這樣:

#!/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)續(xù)篇 - 統(tǒng)一的crontab計劃任務

上面第二點的啟動是通用、自定義、也是自由的啟動方式。

這里再提供一種具體的、統(tǒng)一的啟動方式,即使用crontab的方式。

首先,創(chuàng)建以下表(或見./Library/Task/Data/phalapi_task_progress.sql文件):

CREATE TABLE `phalapi_task_progress` (
      `id` bigint(20) NOT NULL AUTO_INCREMENT,
      `title` varchar(200) DEFAULT '' COMMENT '任務標題',
      `trigger_class` varchar(50) DEFAULT '' COMMENT '觸發(fā)器類名',
      `fire_params` varchar(255) DEFAULT '' COMMENT '需要傳遞的參數(shù),格式自定',
      `interval_time` int(11) DEFAULT '0' COMMENT '執(zhí)行間隔,單位:秒',
      `enable` tinyint(1) DEFAULT '1' COMMENT '是否啟動,1啟動,0禁止',
      `result` varchar(255) DEFAULT '' COMMENT '運行的結(jié)果,以json格式保存',
      `state` tinyint(1) DEFAULT '0' COMMENT '進程狀態(tài),0空閑,1運行中,-1異常退出',
      `last_fire_time` int(11) DEFAULT '0' COMMENT '上一次運行時間',
      PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

接著,添加crontab計劃任務:

$ crontab -e

*/1 * * * * /usr/bin/php /path/to/PhalApi/Library/Task/crontab.php >> /tmp/phalapi_task_crontab.log 2>&1

然后,實現(xiàn)你的計劃任務服務接口:

<?php
class Api_Task_Demo extends PhalApi_Api {

      public function doSth() {
            // ...
      }
}

最后,配置計劃任務:

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)依賴的資源服務

名稱沒有時是否自動創(chuàng)建
curlPhalApi_CUrl
requestPhalApi_Request強制每次初始化,用于本地調(diào)度時
responsePhalApi_Response_Json強制每次初始化,用于本地調(diào)度時

(2)MQ

Redis MQ隊列

Redis MQ隊列需要的配置為:

    'Task' => array(
        //MQ隊列設置,可根據(jù)使用需要配置
        'mq' => array(
            'redis' => array(
                'host' => '127.0.0.1',
                'port' => 6379,
                'prefix' => 'phalapi_task',
                'auth' => '',
            ),
        ),
    ),

其中:

選項是否必須默認值說明
host127.0.0.1redis的HOST
port6379redis的端口
prefixphalapi_taskkey的前綴
authredis的驗證,不為空時執(zhí)行驗證

可以這樣創(chuàng)建Redis MQ隊列:

//方法一:使用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需要的配置為:

    'Task' => array(
        //MQ隊列設置,可根據(jù)使用需要配置
        'mq' => array(
            'file' => array(
                'path' => API_ROOT . '/Runtime',
                'prefix' => 'phalapi_task',
            ),
        ),
    ),

其中:

選項是否必須默認值說明
pathAPI_ROOT/Runtime緩存的文件目錄
prefixphalapi_taskkey的前綴

可以這樣創(chuàng)建文件MQ隊列:

//方法一:使用app.Task.mq.file配置
$mq = new Task_MQ_File();

//方法二:外部依賴注入
$fileCache = new PhalApi_Cache_File(array('path' => '/tmp/cache'));
$mq = new Task_MQ_File($fileCache);

Memcached/Memcache MQ隊列(通常隊列大小不能超過1M,有效期29天)

MC MQ需要的配置為:

    'Task' => array(
        //MQ隊列設置,可根據(jù)使用需要配置
        'mq' => array(
            'mc' => array(
                'host' => '127.0.0.1',
                'port' => 11211,
            ),
        ),
    ),

其中:

選項是否必須默認值說明
host127.0.0.1MC的host
port11211MC端口

可以這樣創(chuàng)建文件MQ隊列:

//方法一:使用app.Task.mq.mc配置
$mq = new Task_MQ_Memcached();

//方法二:外部依賴注入
$mc = new PhalApi_Cache_Memcached(array('host' => '127.0.0.1', 'port' => 11211));
$mq = new Task_MQ_File($mc);

數(shù)據(jù)庫MQ隊列

數(shù)據(jù)庫MQ隊列需要的配置為:

    'tables' => array(

        //請將以下配置拷貝到 ./Config/dbs.php 文件對應的位置中,未配置的表將使用默認路由

        //10張表,可根據(jù)需要,自行調(diào)整表前綴、主鍵名和路由
        'task_mq' => array(
            'prefix' => 'phalapi_',
            'key' => 'id',
            'map' => array(
                array('db' => 'db_demo'),
                array('start' => 0, 'end' => 9, 'db' => 'db_demo'),
            ),
        ),
    )

可以這樣創(chuàng)建數(shù)據(jù)庫MQ隊列:

$mq = new Task_MQ_DB();

數(shù)組MQ隊列

數(shù)組MQ隊列是將MQ存放在PHP的數(shù)組里面,用于單元測試或者是一次性、臨時性的計劃任務調(diào)度。

可以這樣創(chuàng)建數(shù)據(jù)庫MQ隊列:

$mq = new Task_MQ_Array();

(3)本地和遠程調(diào)度

本地調(diào)度的創(chuàng)建

$runner = new Task_Runner_Local($mq, 10);  //10表示每批次彈出10個進行處理

需要注意的是,每次執(zhí)行一個計劃任務,都會重新初始化必要的DI資源服務。
且此調(diào)度方式不能用于接口請求時的同步調(diào)用。

遠程調(diào)度的創(chuàng)建

首先需要以下配置:

    /**
     * 計劃任務配置
     */
    'Task' => array(
        //Runner設置,如果使用遠程調(diào)度方式,請加此配置
        'runner' => array(
            'remote' => array(
                'host' => 'http://library.phalapi.net/demo/',
                'timeoutMS' => 3000,
            ),
        ),
    ),

其中:

選項是否必須默認值說明
host接口域名鏈接
timeoutMS3000接口超時時間,單位毫秒

可以這樣創(chuàng)建:

//使用默認的連接器 - 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個進行處理

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號