laravel-websockets 优雅重启指南:掌握 websockets:restart 命令与软关停机制
后端即时通讯【免费下载链接】laravel-websocketsWebsockets for Laravel. Done right.项目地址https://gitcode.com/gh_mirrors/la/laravel-websockets点击查看免费下载本文聚焦 laravel-websockets 包中的websockets:restart命令讲解如何像queue:restart一样在 Supervisor 托管环境下优雅地重启 WebSocket 服务器。读完本文你将掌握该命令的用法、10 秒内完成重启的底层原理、优雅关停软关停的完整流程以及搭配 Supervisor 实现零中断运维的实战配置。适用场景为什么 WebSocket 服务器需要优雅重启WebSocket 服务器是一个长期驻留的守护进程。官方建议在生产环境使用 Supervisor 这类进程管理器来保证它始终存活详见 部署文档。当你修改了配置、更新了代码、或注册了新的自定义路由参见 自定义 WebSocket 处理器之后往往需要重启服务器才能让改动生效。此时如果直接粗暴地 kill 进程正在连接中的客户端会立即断线且可能丢失状态。laravel-websockets 为此提供了与 Laravel 队列系统queue:restart类似的解决方案向正在运行的服务器广播一个重启信号让它优雅地关闭现有连接再交由 Supervisor 重新拉起进程。快速上手一条命令触发重启根据 官方文档 的定义使用方式极其简单与php artisan queue:restart的体验完全一致php artisan websockets:restart执行后终端会输出如下提示Broadcasted the restart signal to the WebSocket server!该命令本身没有参数选项其全部职责就是广播重启信号。自命令下达起最多 10 秒内正在运行的 WebSocket 服务器会完成软关停随后由 Supervisor配置了autorestarttrue自动把服务重新拉起。底层原理一如何广播重启信号websockets:restart的实现非常精简完整源码位于 src/Console/Commands/RestartServer.php核心逻辑只有两步public function handle() { Cache::forever( beyondcode:websockets:restart, $this-currentTime() ); $this-info( Broadcasted the restart signal to the WebSocket server! ); }通过 Laravel 的Cache门面以Cache::forever将当前时间戳写入固定键名beyondcode:websockets:restartforever表示该值永不过期直到下一次命令再次覆盖它在控制台输出成功提示。也就是说命令本身并不直接操作服务器进程它只是向共享的缓存写入一个信号值时间戳。服务器进程通过周期性地读取这个缓存键感知到时间戳变化后自行触发关停流程。一个关键前提Cache 驱动必须是共享且持久的从上述机制可以推断出一个重要约束命令进程与服务器进程必须能够读到同一个缓存值。生产环境应使用file、redis、memcached或database等持久化且跨进程共享的 Cache 驱动绝不能使用array驱动否则命令写入的信号只存在于当前 CLI 进程的内存中服务器进程根本读不到重启信号会静默丢失。这一点虽然未在文档中显式强调但从 RestartServer.php 与 StartServer.php 均通过Illuminate\Support\Facades\Cache读写同一键名的代码结构可以直接确认。底层原理二服务器端如何感知信号并触发软关停服务器端由websockets:serve命令StartServer.php驱动。该命令在启动时会调用configureRestartTimer()注册一个每 10 秒触发一次的周期性定时器public function configureRestartTimer() { $this-lastRestart $this-getLastRestart(); $this-loop-addPeriodicTimer(10, function () { if ($this-getLastRestart() ! $this-lastRestart) { $this-triggerSoftShutdown(); } }); } protected function getLastRestart() { return Cache::get( beyondcode:websockets:restart, 0 ); }工作流程如下服务器启动时将缓存中的重启时间戳读入内存变量$this-lastRestart作为基线事件循环每 10 秒执行一次回调调用getLastRestart()重新读取缓存中的时间戳若两次读取的值不一致说明有人执行过websockets:restart随即调用triggerSoftShutdown()进入优雅关停。这正是文档中最多 10 秒内服务器会被重启的由来——10 秒是轮询周期上限而不是延迟固定为 10 秒。实际等待时间取决于轮询定时器恰好落在哪个相位上最短可能仅需数毫秒。优雅关停Soft Shutdown完整流程triggerSoftShutdown()是整套机制的落点其实现见 StartServer.php展示了一个教科书式的优雅关停流程protected function triggerSoftShutdown() { $channelManager $this-laravel-make(ChannelManager::class); // 1. 关闭新连接入口 $channelManager-declineNewConnections(); // 2. 收集本地全部连接逐个触发 onClose 并关闭 $channelManager-getLocalConnections() -then(function ($connections) { return all(collect($connections)-map(function ($connection) { return app(websockets.handler) -onClose($connection) -then(function () use ($connection) { $connection-close(); }); })-toArray()); }) -then(function () { // 3. 全部连接处理完毕后停止事件循环 $this-loop-stop(); }); }三个阶段环环相扣拒绝新连接调用ChannelManager::declineNewConnections()将实例内部标记acceptsNewConnections置为false对应 LocalChannelManager.php此后新的 WebSocket 握手请求将不再被接受逐个关闭现有连接通过getLocalConnections()获取当前实例上的所有连接逐个交给websockets.handler的onClose()完成反订阅清理连接会自动从所有频道中注销随后调用$connection-close()真正断开。这些操作以 React Promise 链式串联全部完成前不会进入下一步停止事件循环所有连接优雅关闭后$this-loop-stop()让进程自然退出。进程退出后Supervisor 检测到子进程结束配置了autorestarttrue会自动重新启动websockets:serve新进程从缓存读取到的是更新后的重启时间戳基线从而继续正常运行。与 SIGTERM/SIGINT 软关停的异同值得一提的是同样的triggerSoftShutdown()也被用于处理系统信号。在 StartServer.php 中当 PCNTL 扩展可用时服务器会注册 SIGTERM 与 SIGINT 的监听器收到信号后打印Closing existing connections...并执行同样的软关停流程$this-loop-addSignal(SIGTERM, function () { $this-line(Closing existing connections...); $this-triggerSoftShutdown(); }); $this-loop-addSignal(SIGINT, function () { $this-line(Closing existing connections...); $this-triggerSoftShutdown(); });两者的区别在于触发源websockets:restart由外部命令驱动通过缓存信号触发适合在部署脚本、CI 流程或运维操作中调用SIGTERM/SIGINT由操作系统驱动例如手动CtrlC或执行kill时触发。殊途同归两者最终都走declineNewConnections()→ 逐个onClose()→loop-stop()这条优雅路径确保连接不丢失、频道状态被正确清理。相关行为在 StartServerTest.php 中有对应测试test_pcntl_sigint_signal与test_pcntl_sigterm_signal均会先建立活跃连接再发送信号。结合 Supervisor 的完整运维方案既然优雅重启依赖 Supervisor 自动拉起进程这里给出完整的配套配置。首先安装 SupervisorDebian/Ubuntuapt install supervisorRed Hat/CentOSyum install supervisor并systemctl enable supervisord然后在/etc/supervisor/conf.dDebian/Ubuntu或/etc/supervisord.dRed Hat/CentOS下创建websockets.conf[program:websockets] command/usr/bin/php /home/laravel-echo/laravel-websockets/artisan websockets:serve numprocs1 autostarttrue autorestarttrue userlaravel-echo加载配置并启动supervisorctl update supervisorctl start websockets supervisorctl status这样一套组合的日常运维节奏是发布新代码、修改配置或注册新路由后执行php artisan websockets:restart服务器在 10 秒内优雅关闭所有连接并退出Supervisor 检测到进程退出立即自动重启websockets:serve服务无缝衔接。完整的 Supervisor 部署说明包括minfds打开文件数上限调整可参考 部署文档服务启动参数如--host、--port详见 启动文档。多实例 / 多服务器场景下的行为从机制上看该重启信号是广播式的所有运行中的 WebSocket 服务器实例都会周期性地读取同一个缓存键因此一次websockets:restart会让集群中的每个实例都在各自的事件循环内感知到信号变化并各自执行软关停。在多节点横向扩展部署时参见 横向扩展文档这意味着你只需要在任意一台机器上执行一次命令即可对整个集群发出重启请求无需逐个节点操作。测试与验证仓库为这套机制提供了自动化测试保障tests/Commands/RestartServerTest.php 中的test_it_can_broadcast_restart_signal验证了执行websockets:restart后缓存键beyondcode:websockets:restart的值会更新为当前时间assertGreaterThanOrEqual断言新值不小于执行前的时间tests/Commands/StartServerTest.php 则验证了服务器在 SIGINT / SIGTERM 信号下能够正常完成软关停间接佐证了triggerSoftShutdown()流程的可用性。你也可以在自己的环境中手动验证先以php artisan websockets:serve启动服务器并保持终端在前台运行另开一个终端执行php artisan websockets:restart观察服务器终端——它会在 10 秒内安静地完成关停流程并退出若由 Supervisor 托管则会立刻看到进程被重新拉起。常见问题与注意事项重启命令没有生效优先检查 Laravel 的 Cache 驱动配置。array驱动下信号无法跨进程传递同时确认服务器进程与命令运行在同一个应用实例/同一个.env配置下二者读取的缓存后端必须一致。10 秒是从哪里来的来自 StartServer.php 中addPeriodicTimer(10, ...)的轮询周期这是最迟 10 秒而非固定 10 秒。为什么是优雅关闭而非强杀软关停会先拒绝新连接、再逐个清理频道订阅关系、最后才停止事件循环避免客户端数据与频道成员状态不一致强杀进程则可能留下脏状态。务必配合进程管理器使用websockets:restart只是发出信号它不会自己拉起新进程。没有 Supervisor 守护时进程退出后将不再提供服务此时需要手动重新执行php artisan websockets:serve。赞分享后端即时通讯【免费下载链接】laravel-websocketsWebsockets for Laravel. Done right.项目地址https://gitcode.com/gh_mirrors/la/laravel-websockets点击查看免费下载相关推荐零停机重启革命Goagain优雅重启原理解析零停机重启革命Goagain优雅重启原理解析 引言服务重启的痛点与解决方案 你是否曾因服务重启导致用户请求失败而头疼在高可用系统架构中零停机部署后端gorilla/mux优雅关闭实现零停机部署的平滑重启机制gorilla/mux优雅关闭实现零停机部署的平滑重启机制 痛点为什么需要优雅关闭 在现代微服务架构中服务部署和更新是家常便饭。传统的粗暴关闭方式会导致后端Laravel Octane 命令详解启动、停止、重载等所有操作指南Laravel Octane 命令详解启动、停止、重载等所有操作指南 Laravel Octane 是专为 Laravel 应用程序设计的性能加速工具通过利后端开发工具上一篇3大核心技术深度解析MFCUK从DarkSide攻击到MiFare Classic安全研究实战下一篇Olares files 路径语法与命名空间规则全解从 drive/Home 到云盘账号的地址体系与命令约束创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

栅格地图路径规划提速:K-Means聚类与SVM分区实战解析

栅格地图路径规划提速:K-Means聚类与SVM分区实战解析

简介:面向智能清洁机器人路径规划领域的研究者与开发者,这份PDF文档围绕K-Means聚类与SVM结合的栅格分区路径规划方法展开,重点解决复杂障碍物栅格地图中传统蚁群算法收敛慢、易陷入局部最优的问题。文档从栅格地图建模入手,分别阐…

2026/10/13 12:38:43 阅读更多 →
KingbaseES V8.6 GIS迁库指南:Oracle与PostGIS迁移避坑

KingbaseES V8.6 GIS迁库指南:Oracle与PostGIS迁移避坑

简介:面向需要将 GIS 空间数据迁移至人大金仓 KingbaseES 的数据库管理员、GIS 工程师与技术决策者,系统梳理 V8.6 版本下的完整迁移方法论。文档开篇介绍 KingbaseES 对矢量、栅格数据的支持及与 ArcGIS/GeoScene、SuperMap 的集成能力;随后…

2026/10/13 12:38:43 阅读更多 →
从慕课答案到AI项目落地:创新创业对接范式与最小验证脚本

从慕课答案到AI项目落地:创新创业对接范式与最小验证脚本

简介:这份资源是Uooc平台《人工智能行业与创新创业对接范式》慕课的配套测验答案整理,面向正在修读该课程、需要核对小节测验结果或复习知识点的学生。内容以docx文档形式呈现,覆盖人工智能发展第三次高潮、计算机视觉市场规模、六大核心技术…

2026/10/13 12:38:43 阅读更多 →

最新新闻

RabbitMQ从0到1:核心模型、生产实践与高频问题排查指南

RabbitMQ从0到1:核心模型、生产实践与高频问题排查指南

如果你手头有个项目需要在系统里传递消息,十有八九会想到RabbitMQ。但很多人装完、跑个Hello World就算“会用”了,等遇到连接失败、消息丢失、谁该消费谁不该消费、甚至admin账号没法创建virtual host时,才发现自己其实并不理解它。这篇就从…

2026/10/13 13:13:23 阅读更多 →
CANN全面开源:异构计算架构如何让性能调优不再靠猜

CANN全面开源:异构计算架构如何让性能调优不再靠猜

1. 先搞清楚CANN是什么,以及“开源开放”为什么是一条难走但必须走的路 很多做AI开发的同行,第一次听到CANN这个缩写,是在跑模型的时候拿到一张报错截图,或者是在某个加速卡的性能优化文档里。CANN的全称是异构计算架构&#xff0…

2026/10/13 13:13:23 阅读更多 →
Python+微信小程序+AI:从零搭建对话式健康风险评估系统

Python+微信小程序+AI:从零搭建对话式健康风险评估系统

最近半年我一直泡在一个“Python 微信小程序 AI健康问诊”的个人项目里。起因很简单:家里人经常在小程序里看各种健康问答,但问题描述得零零散散,得到的回答又是通用模板,根本没结合个人的基础情况。我就想,能不能自…

2026/10/13 13:13:23 阅读更多 →
若依集成EasyExcel实战:告别手写POI,搞定复杂表头与大数据导出

若依集成EasyExcel实战:告别手写POI,搞定复杂表头与大数据导出

从写下第一行导出代码到最后彻底放弃手写 POI,大概花了我整整两周时间。彼时我们的若依后台管理系统刚好需要一批新的报表导出功能,领导给了个听起来特别简单的要求:把数据导成 Excel,表头要好看点,列宽自动适应&#…

2026/10/13 13:13:23 阅读更多 →
AI产品经理的五种分化:从模型微调到行业落地,你适合哪一类?

AI产品经理的五种分化:从模型微调到行业落地,你适合哪一类?

最近好几个朋友来找我聊转行,说想往AI产品经理方向走,结果翻了一圈招聘JD直接懵了:同一个岗位名称,有的要求懂Transformer、懂模型微调,有的只要会画原型写PRD,有的甚至要跟着销售跑客户。这到底是一个岗位…

2026/10/13 13:13:23 阅读更多 →
Mars版Eclipse绿色版配置指南:JAVA_HOME、Tomcat与避坑要点

Mars版Eclipse绿色版配置指南:JAVA_HOME、Tomcat与避坑要点

简介:这是一份Eclipse JEE Mars R的Windows 64位官方绿色版压缩包,面向Java企业级与Web开发者,针对J2EE项目开发与调试环境而封装。版本基于2015年6月30日发布的Mars R正式版,解压后免安装即可运行,省去安装向导与手动…

2026/10/13 13:12:22 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →