在php-fpm或apache中使用swoole提供的task功能

韓天峰發表於2019-02-16

AsyncTask是swoole提供一套生產者消費者模型,可以方便地將一個慢速任務投遞到佇列,由程式池非同步地執行。task功能目前只能在swoole_server中使用。1.9.0版本提供了RedisServer框架,可以基於RedisServer和Task實現一個Server程式,在php-fpm或apache中直接呼叫Redis擴充套件就可以使用swoole的task功能了。

建立RedisServer

<?php
use SwooleRedisServer;

$server = new Server("127.0.0.1", 9501, SWOOLE_BASE);

$server->set(array(
    `task_worker_num` => 32,
    `worker_num` => 1,
));

$server->setHandler(`LPUSH`, function ($fd, $data) use ($server) {
    $taskId = $server->task($data);
    if ($taskId === false)
    {
        return Server::format(Server::ERROR);
    }
    else
    {
        return Server::format(Server::INT, $taskId);
    }
});

$server->on(`Finish`, function() {

});

$server->on(`Task`, function ($serv, $taskId, $workerId, $data) {
    //處理任務
});

$server->start();
  • 如果是本機呼叫可以監聽UnixSocket,區域網內呼叫需要使用IP:PORT

  • Task中$data就是客戶端投遞的資料

  • 其他語言也可以使用Redis客戶端投遞任務

  • 可以根據Task任務執行的速度調節task_worker_num控制啟動的程式數量,這些程式是由swoole底層負責管理的,在發生致命錯誤或程式退出後底層會重新建立新的任務程式

投遞任務

$redis = new Redis;
$redis->connect(`127.0.0.1`, 9501);
$taskId = $redis->lpush("myqueue", json_encode(array("hello", "swoole")));

注意這個RedisServer並不是一臺真正的Redis伺服器,它只支援LPUSH一個指令。

相關文章