Laravel8中使Swoole协程
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
请登录后再评论