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
一個指令。