当前位置: 首页 > news >正文

Laravel Octane 和 Swoole 协程的使用分析

之前在工作中使用 Laravel Octane 的 concurrently 处理并发时,发现在队列和定时任务中不会触发并发效果。经过分析,作了如下猜测:队列和定时任务都属于一个独立的进程,与 Octane 服务无关,而 Octane concurrently 恰恰需要在 Octane 环境下才能运行。

后来通过代码进行环境检测和查看 php 的进程,证明猜想成立。

info('check env', ['served by octane' => isset($_SERVER['LARAVEL_OCTANE']) && ((int)$_SERVER['LARAVEL_OCTANE'] === 1),'on swoole server' => (extension_loaded('swoole') || extension_loaded('openswoole')) && app()->bound(Server::class)
]);

为了能够在任意代码中实现并发,我们研究参考了 Hyperf 框架关于协程的代码,然后抽取了如下两个类:

<?phpnamespace App\Services;use App\Exceptions\ParallelExecutionException;
use Laravel\Octane\Facades\Octane;
use Throwable;
use Swoole\Coroutine as Co;class Parallel
{protected array $callbacks = [];protected array $results = [];/*** @var Throwable[]*/protected array $throwables = [];public function add(callable $callable, $key = null): void{if (is_null($key)) {$this->callbacks[] = $callable;} else {$this->callbacks[$key] = $callable;}}public function wait(bool $throw = true): array{if (isset($_SERVER['LARAVEL_OCTANE']) && ((int)$_SERVER['LARAVEL_OCTANE'] === 1)) {return Octane::concurrently($this->callbacks, 300000);}app('log')->useLoggingLoopDetection(false);Co\run(function () {foreach ($this->callbacks as $key => $callback) {Co::create(function () use ($callback, $key) {try {$this->results[$key] = $callback();} catch (Throwable $throwable) {$this->throwables[$key] = $throwable;unset($this->results[$key]);}});}});if ($throw && ($throwableCount = count($this->throwables)) > 0) {$message = 'Detecting ' . $throwableCount . ' throwable occurred during parallel execution:' . PHP_EOL . $this->formatThrowAbles($this->throwables);$executionException = new ParallelExecutionException($message);$executionException->setResults($this->results);$executionException->setThrowAbles($this->throwables);unset($this->results, $this->throwables);throw $executionException;}app('log')->useLoggingLoopDetection(true);return $this->results;}private function formatThrowAbles(array $throwables): string{$output = '';foreach ($throwables as $key => $value) {$output .= sprintf('(%s) %s: %s' . PHP_EOL . '%s' . PHP_EOL, $key, get_class($value), $value->getMessage(), $value->getTraceAsString());}return $output;}
}
<?phpnamespace App\Exceptions;use RuntimeException;class ParallelExecutionException extends RuntimeException
{protected array $results = [];protected array $throwables = [];public function getResults(): array{return $this->results;}public function setResults(array $results): void{$this->results = $results;}public function getThrowAbles(): array{return $this->throwables;}public function setThrowAbles(array $throwables): array{return $this->throwables = $throwables;}
}

其中,第一个类的作用是检测系统是否运行在 Octane 环境下,是则调用Octane concurrently,否则就执行 Swoole 协程代码,使用起来也比较简单:

$parallel = new Parallel();
$parallel->add(fn() => $this->analysisStructure(), 'structure');
$parallel->add(fn() => $this->analysisHabit(), 'habit');
['structure' => $structure,'habit' => $habit,
] = $parallel->wait();

之所以没有完全使用 Swoole 协程,是因为相比之下,Octane 代码更加优雅,我们在期待着某天更新后,Octane concurrently 也能直接在队列中运行使用。

第二个类的作用比较简单,就是对协程中异常的一个定义。

另外在分析过程中,我们也发现了一个比较有意思的事情:
在这里插入图片描述

如图所示,当我在路由中运行检测代码时,Octane 和 Swoole Server 都为 true;在控制器中运行检测代码时,又只有 Octane 为true;为什么会有这样的区分?我个人猜测是 Octane 在将框架代码读进内存时,特意跳过了控制器中的代码,以避免数据更新不及时等问题。

有知道具体原因的小伙伴,欢迎留言探讨。

相关文章:

Laravel Octane 和 Swoole 协程的使用分析

之前在工作中使用 Laravel Octane 的 concurrently 处理并发时&#xff0c;发现在队列和定时任务中不会触发并发效果。经过分析&#xff0c;作了如下猜测&#xff1a;队列和定时任务都属于一个独立的进程&#xff0c;与 Octane 服务无关&#xff0c;而 Octane concurrently 恰恰…...

腾讯云又双叕降价,云服务器配置优惠价格表2024新版报价

腾讯云服务器多少钱一年&#xff1f;62元一年起&#xff0c;2核2G3M配置&#xff0c;腾讯云2核4G5M轻量应用服务器218元一年、756元3年&#xff0c;4核16G12M服务器32元1个月、312元一年&#xff0c;8核32G22M服务器115元1个月、345元3个月&#xff0c;腾讯云服务器网txyfwq.co…...

【react native】css踩坑记录

1、IOS上面opacity重叠失效 在 iOS 上&#xff0c;当两个具有相同背景色的元素重叠时&#xff0c;不透明度&#xff08;opacity&#xff09;较低的元素会显示在较高的元素上方。 所以考虑使用rgba的形式。 // 对于下面这种写法&#xff0c;如果存在container和activeIndicat…...

ChatGPT学习第四周

&#x1f4d6; 学习目标 ChatGPT实践操作 通过实际操作和练习&#xff0c;加深对ChatGPT功能的理解。 项目&#xff1a;创建一个ChatGPT应用案例 设计一个基于ChatGPT的小项目&#xff0c;将理论应用于实践。 ✍️ 学习活动 学习资料 《万字干货&#xff01;ChatGPT 从零完…...

2D割草/吸血鬼游戏 性能优化——GPU Spine动画

视频中万人同屏方案(gpu动画、渲染、索敌、避障等功能)&#xff0c;可某宝搜店铺&#xff1a;【游戏开发资源商店】获取整套方案源码。 在过去的几年里&#xff0c;割草、类吸血鬼玩法的游戏频出爆款&#xff0c;其丰富的技能、满屏特效、刷怪清屏的解压畅快是此类游戏的核心&…...

VSCode上搭建C/C++开发环境(vscode配置c/c++环境)Windows系统---保姆级教程

引言劝退 VSCode&#xff0c;全称为Visual Studio Code&#xff0c;是由微软开发的一款轻量级&#xff0c;跨平台的代码编辑器。大家能来搜用VSCode配置c/c&#xff0c;想必也知道VSCode的强大&#xff0c;可以手握一个VSCode同时编写如C&#xff0c;C&#xff0c;C#&#xff…...

[渗透教程]-013-嗅探工具-wireshark操作

文章目录 tor下载wireshark抓包类型启动场景实战tor下载 tor下载链接 zlibary暗网地址 2681506@gmail.com YanErrol123@wireshark Wireshark是网络封包分析软件,可以抓包.可以 使用winpcap与网卡直接进行数据交换.作用: 网络管理员使用wireshark来检测网络问题,网络工程师使用…...

NLP Seq2Seq模型

&#x1f368; 本文为[&#x1f517;365天深度学习训练营学习记录博客&#x1f366; 参考文章&#xff1a;365天深度学习训练营&#x1f356; 原作者&#xff1a;[K同学啊 | 接辅导、项目定制]\n&#x1f680; 文章来源&#xff1a;[K同学的学习圈子](https://www.yuque.com/mi…...

如何在 Linux 上使用 dmesg 命令

文章目录 1. Overview2.ring buffer怎样工作&#xff1f;3.dmesg命令4.移除sudo需求5. 强制彩色输出6.使用人性化的时间戳7.使用dmesg的人性化可读时间戳8.观察实时event9.检索最后10条消息10.搜索特定术语11.使用Log Levels12.使用Facility Categories13.Combining Facility a…...

WPF的DataGrid设置标题头

要设置DataGrid标题头的分割线、背景色和前景色等属性&#xff0c;您可以使用DataGrid的样式和模板来自定义标题头的外观。下面是详细解释以及示例代码&#xff1a; 分割线设置&#xff1a; 您可以使用DataGrid.ColumnHeaderStyle样式中的BorderThickness和BorderBrush属性来设…...

【软考】UML中的图之通信图

目录 1. 说明2. 图示3. 特性4. 例题4.1 例题1 1. 说明 1.通信图强调收发消息的对象的结构组织2.早期版本叫做协作图3.通信图强调参加交互的对象和组织4.首先将参加交互的对象作为图的顶点&#xff0c;然后把连接这些对象的链表示为图的弧&#xff0c;最后用对象发送和接收的消…...

为什么ChatGPT预训练能非常好地捕捉语言的普遍特征和模式

ChatGPT能够非常好地捕捉语言的普遍特征和模式&#xff0c;主要得益于以下几个方面的原因&#xff1a; 大规模语料库&#xff1a;ChatGPT的预训练是在大规模文本语料库上进行的&#xff0c;这些语料库涵盖了来自互联网、书籍、文章、对话记录等多种来源的丰富数据。这种大规模的…...

如何安装ProtoBuf环境

1 &#x1f351;下载 ProtoBuf&#x1f351; 下载 ProtoBuf 前⼀定要安装依赖库&#xff1a;autoconf automake libtool curl make g unzip 如未安装&#xff0c;安装命令如下&#xff1a; Ubuntu ⽤⼾选择&#xff1a; sudo apt-get install autoconf automake libtool cur…...

C语言 vs Rust应该学习哪个?

C语言 vs Rust应该学习哪个&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「C语言的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&#xff01;&am…...

IT廉连看——Uniapp——配置文件pages

IT廉连看——Uniapp——配置文件pages [IT廉连看] 本堂课主要为大家介绍pages.json这个配置文件 一、打开官网查看pages.json可以配置哪些属性。 下面边写边讲解 新建一个home页面理解一下这句话。 以下一些页面的通用配置 通用设置里我们可以对导航栏和状态栏进行一些设…...

服务器上部署WEb服务方法

部署Web服务在服务器上是一个比较复杂的过程。这不仅仅涉及到配置环境、选择软件和设置端口&#xff0c;更有众多其它因素需要考虑。以下是在服务器上部署WEb服务的步骤&#xff1a; 1. 选择服务器&#xff1a;根据项目规模和预期访问量&#xff0c;选择合适的服务器类型和配置…...

设计模式:模版模式

模板模式&#xff08;Template Pattern&#xff09;是一种行为型设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将一些步骤的具体实现延迟到子类中。模板模式使得子类可以在不改变算法结构的情况下重新定义算法的某些步骤。 在模板模式中&#xff0c;将算法的…...

pikachu之特殊注入之搜索型注入、xx型注入、insert/update注入、delete注入、宽字节注入

一步一脚印&#xff01;&#xff01;&#xff01; 补充&#xff1a;此处为什么不写http请求头注入&#xff0c;因为该注入类型只是换了注入点&#xff0c;语句其他根本没有什么变化 1.搜索型 先尝试输入常用payload&#xff1a; 1 or 11 #。 已经有回显 我们在查看提示 我们…...

docker构建hyperf环境

一&#xff0c;构建hyperf 镜像 官网git https://github.com/hyperf/hyperf-docker 使用dockerfile构建镜像 根据需要这里我使用8.1 swoole版本的镜像 在/home/hyperfdocker 目录中新建一个Dockerfile文件&#xff0c;将这个git上的Dockerfile内容复制粘贴进去 docker build…...

WPF常用mvvm开源框架介绍 vue的mvvm设计模式鼻祖

WPF&#xff08;Windows Presentation Foundation&#xff09;是一个用于构建桌面应用程序的.NET框架&#xff0c;它支持MVVM&#xff08;Model-View-ViewModel&#xff09;架构模式来分离UI逻辑和业务逻辑。以下是一些常用的WPF MVVM开源框架&#xff1a; Prism Prism是由微软…...

HC-05蓝牙模块实战:从AT指令到多设备联通的完整指南

1. HC-05蓝牙模块入门&#xff1a;从拆箱到AT指令配置 第一次拿到HC-05蓝牙模块时&#xff0c;很多人会被这个小巧的蓝色电路板难住。这个只有拇指大小的模块&#xff0c;实际上集成了完整的蓝牙2.0EDR通信功能。我刚开始接触时也犯过不少错误&#xff0c;比如把TX和RX接反导致…...

labview解析can报文,DBC解析Can报文,支持asc、csv、txt格式文件离线解析...

labview解析can报文&#xff0c;DBC解析Can报文&#xff0c;支持asc、csv、txt格式文件离线解析&#xff0c;可通过设置移位&#xff0c;逗号数&#xff0c;空格数等特征索引ID和报文数据&#xff0c;解析报文&#xff0c;可将解析结果存储为本地txt文本&#xff0c;可设置循环…...

2026亚马逊爬虫终极实战:绕过AWS WAF v2+JA4+TLS指纹检测,零封号搭建跨境电商数据监控系统

一、项目背景&#xff1a;2026亚马逊反爬现状 上个月我维护了一年的亚马逊爬虫突然全挂了&#xff0c;所有请求统一返回403 Forbidden。排查了整整一周才发现&#xff0c;亚马逊在2026年Q1全面升级了AWS WAF v2 Bot Control&#xff0c;新增了JA4 TLS指纹检测和HTTP/2帧顺序验证…...

终极指南:5分钟学会用Virtual Kubelet在非K8s环境部署容器

终极指南&#xff1a;5分钟学会用Virtual Kubelet在非K8s环境部署容器 【免费下载链接】virtual-kubelet Virtual Kubelet is an open source Kubernetes kubelet implementation. 项目地址: https://gitcode.com/gh_mirrors/vi/virtual-kubelet Virtual Kubelet是一个开…...

3分钟掌握猫抓浏览器扩展:网页视频音频一键下载的终极指南

3分钟掌握猫抓浏览器扩展&#xff1a;网页视频音频一键下载的终极指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常遇到想保存网页视…...

字符函数 和 字符串函数超全详解(后续会持续优化)

&#x1f4d6; 目录字符分类函数字符转换函数strlen 的使用和模拟实现strcpy /strncpy 的使用和模拟实现strcat /strncat 的使用和模拟实现strcmp /strncmp 的使用和模拟实现 strstr 的使用和模拟实现strtok 函数的使用strerror 函数的使用一、字符分类函数核心说明头文件&am…...

LIVE MINI ESP32开发板进阶指南:活用DRV2605L库函数,自定义你的专属触觉反馈效果

1. 从预设到自定义&#xff1a;DRV2605L触觉引擎的进阶玩法 当你已经玩转DRV2605L模块的117种预设效果后&#xff0c;是否觉得这些固定模式无法满足你的创意需求&#xff1f;作为一款专业触觉反馈驱动芯片&#xff0c;DRV2605L真正的魅力在于其可编程特性。我曾在开发游戏外设时…...

Unlock Music音乐解锁工具:打破音乐平台枷锁的终极解决方案

Unlock Music音乐解锁工具&#xff1a;打破音乐平台枷锁的终极解决方案 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库&#xff1a; 1. https://github.com/unlock-music/unlock-music &#xff1b;2. https://git.unlock-music.dev/um/web 项目地址: …...

电商卖家注意了!萤火AI实测:从抠图到带货视频,一个人搞定整个团队的工作

在电商行业摸爬滚打这么多年&#xff0c;我深知一个真理&#xff1a;“做图难&#xff0c;做视频更难&#xff1b;请美工贵&#xff0c;请摄影团队更贵。” 无论是国内淘系、抖音&#xff0c;还是出海做亚马逊、TikTok&#xff0c;视觉物料永远是转化的第一道门槛。很多时候&a…...

终极游戏手柄映射指南:5分钟让任何手柄玩转PC游戏

终极游戏手柄映射指南&#xff1a;5分钟让任何手柄玩转PC游戏 【免费下载链接】antimicrox Graphical program used to map keyboard buttons and mouse controls to a gamepad. Useful for playing games with no gamepad support. 项目地址: https://gitcode.com/GitHub_Tr…...