Laravel8中使Swoole协程

作者: 温新

分类: 【高性能PHP】

阅读: 3172

时间: 2021-04-24 16:37:31

Laravel8中如何使用Swoole协程?此篇文章仍旧以LaravelS扩展包作为案例笔记。本篇文章中需要先使用异步任务,关于异步任务请先按照 基于LaravelS Swoole实现异步任务队列 实现(完成前2步即可)。

第一步:编码协程代码

文件:app/Processes/TestProcess.php

<?php
namespace App\Processes;

use App\Jobs\TestTask;
use Hhxsv5\LaravelS\Swoole\Process\CustomProcessInterface;
use Hhxsv5\LaravelS\Swoole\Task\Task;
use Illuminate\Support\Facades\Log;
use Swoole\Coroutine;
use Swoole\Http\Server;
use Swoole\Process;

class TestProcess implements CustomProcessInterface
{
    public static function getName()
    {
        return "test"; // 进程名称
    }

    public static function callback(Server $swoole, Process $process)
    {
        // 进程运行的代码,不能退出,一旦退出Manager进程会自动再次创建该进程
        // 频繁退出/创建进程会消耗系统性能
        Log::info(__METHOD__, [posix_getpid(), $swoole->stats()]);
        while (true) {  // 需要通过 while(true) 进行循环保持不退出
            Log::info('Test process: running');
            // 相当于 PHP 的 sleep 函数,但是底层会自动启动协程,让出时间片,睡眠时间结束后恢复运行
            Coroutine::sleep(1);
            // 在自定义进程中调度任务, 但不支持任务的 finish 回调
            // 注意:
            // 1、第二个参数设置为 true,表示通过消息管道通信
            // 2、在 config/laravels.php 配置文件中设置 task_ipc_mode 为 1 或 2
            // task_ipc_mode 用于设置 task worker 与 worker 进程之间的通信模式,1 表示通过 unix socket,2 表示使用消息队列
            $ret = Task::deliver(new TestTask('task data'), true);
            var_dump($ret);
            // 上一层会捕获本函数抛出的异常并将其记录到 Swoole 日志中,如果异常数超过10个,该进程会退出,然后 Master 进程会重新创建这个进程
        }
    }

    public static function onReload(Server $swoole, Process $process)
    {
        // 结束进程
        $process->exit(0);
    }
}

注意:callback()方法不能退出,如果退出,Manager进程将会重新创建进程

第二步:注册

修改config/laravels.php

'processes' => [
    [
        'class' =>  \App\Processes\TestProcess::class,
        'redirect' => false, // 是否重定向输入输出
        'pipe'     => 0,     // 管道类型:0不创建管道,1创建SOCK_STREAM类型管道,2创建SOCK_DGRAM类型管道
        'enable'   => true,  // 是否启用,默认true
    ],
],

第三步:启动laravels

php bin/laravels start

第四步:查看laravel.log

tail -f laravel.log

[2021-04-24 16:34:06] local.INFO: Test process: running  
[2021-04-24 16:34:07] local.INFO: App\Jobs\TestTask: 开始处理任务 ["task data"] 
[2021-04-24 16:34:07] local.INFO: Test process: running  
[2021-04-24 16:34:08] local.INFO: App\Jobs\TestTask: 开始处理任务 ["task data"] 
[2021-04-24 16:34:08] local.INFO: Test process: running  
[2021-04-24 16:34:09] local.INFO: Test process: running  
[2021-04-24 16:34:09] local.INFO: App\Jobs\TestTask: 开始处理任务 ["task data"] 
[2021-04-24 16:34:10] local.INFO: Test process: running  

由于使用swoole 协程,异步任务会每1秒执行一次且是异步非阻塞

2021-04-25

请登录后再评论