Task

    因为 Task 并不是默认组件,所以在使用的时候需要在 server.php 增加 Task 相关的配置。

    1. <?php
    2. declare(strict_types=1);
    3. use Hyperf\Server\SwooleEvent;
    4. return [
    5. // 这里省略了其它不相关的配置项
    6. 'settings' => [
    7. // Task Worker 数量,根据您的服务器配置而配置适当的数量
    8. 'task_worker_num' => 8,
    9. 'task_enable_coroutine' => false,
    10. ],
    11. 'callbacks' => [
    12. // Task callbacks
    13. SwooleEvent::ON_TASK => [Hyperf\Framework\Bootstrap\TaskCallback::class, 'onTask'],
    14. SwooleEvent::ON_FINISH => [Hyperf\Framework\Bootstrap\FinishCallback::class, 'onFinish'],
    15. ];

    Task 组件提供了 主动方法投递注解投递 两种使用方法。

    1. <?php
    2. use Hyperf\Utils\Coroutine;
    3. use Hyperf\Utils\ApplicationContext;
    4. use Hyperf\Task\Annotation\Task;
    5. class AnnotationTask
    6. {
    7. /**
    8. * @Task
    9. public function handle($cid)
    10. {
    11. return [
    12. 'worker.cid' => $cid,
    13. // task_enable_coroutine=false 时返回 -1,反之 返回对应的协程 ID
    14. ];
    15. }
    16. }
    17. $container = ApplicationContext::getContainer();
    18. $task = $container->get(AnnotationTask::class);
    19. $result = $task->handle(Coroutine::id());

    Swoole 暂时没有协程化的函数列表

    • mysql,底层使用 libmysqlclient
    • curl,底层使用 libcurl,在 Swoole 4.4 后底层进行了协程化(beta)
    • mongo,底层使用 mongo-c-client
    • pdo_pgsql
    • pdo_ori
    • pdo_firebird

    以下我们实现两个方法 insertquery,其中需要注意的是 manager 方法不能使用 Task,因为 Task 会在对应的 Task进程 中处理,然后将数据从 Task进程 返回到 Worker进程 。所以 Task方法 的入参和出参最好不要携带任何 IO,比如返回一个实例化后的 Redis 等等。

    使用如下