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

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

建立RedisServer

<?php
use Swoole\Redis\Server;

$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:PORTredis

  • Task中$data就是客戶端投遞的數據apache

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

  • 能夠根據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一個指令。swoole

相關文章
相關標籤/搜索