Task
因为 Task 并不是默认组件,所以在使用的时候需要在 server.php
增加 Task
相关的配置。
<?php
declare(strict_types=1);
use Hyperf\Server\SwooleEvent;
return [
// 这里省略了其它不相关的配置项
'settings' => [
// Task Worker 数量,根据您的服务器配置而配置适当的数量
'task_worker_num' => 8,
'task_enable_coroutine' => false,
],
'callbacks' => [
// Task callbacks
SwooleEvent::ON_TASK => [Hyperf\Framework\Bootstrap\TaskCallback::class, 'onTask'],
SwooleEvent::ON_FINISH => [Hyperf\Framework\Bootstrap\FinishCallback::class, 'onFinish'],
];
Task 组件提供了 主动方法投递
和 注解投递
两种使用方法。
<?php
use Hyperf\Utils\Coroutine;
use Hyperf\Utils\ApplicationContext;
use Hyperf\Task\Annotation\Task;
class AnnotationTask
{
/**
* @Task
public function handle($cid)
{
return [
'worker.cid' => $cid,
// task_enable_coroutine=false 时返回 -1,反之 返回对应的协程 ID
];
}
}
$container = ApplicationContext::getContainer();
$task = $container->get(AnnotationTask::class);
$result = $task->handle(Coroutine::id());
Swoole 暂时没有协程化的函数列表
- mysql,底层使用 libmysqlclient
- curl,底层使用 libcurl,在 Swoole 4.4 后底层进行了协程化(beta)
- mongo,底层使用 mongo-c-client
- pdo_pgsql
- pdo_ori
- pdo_firebird
以下我们实现两个方法 insert
和 query
,其中需要注意的是 manager
方法不能使用 Task
,因为 Task
会在对应的 Task进程
中处理,然后将数据从 Task进程
返回到 Worker进程
。所以 Task方法
的入参和出参最好不要携带任何 IO
,比如返回一个实例化后的 Redis
等等。
使用如下