如何正确配置Workerman的 send_buffer_limit 避免内存溢出?

酷墨酱_4119

酷墨酱_4119

2026-05-26

346人浏览

原创

send_buffer_limit是workerman中tcpconnection的发送缓冲区软上限,仅暂停超限连接的send操作,不阻止php内存中数据累积,故无法防止oom。

如何正确配置workerman的 send_buffer_limit 避免内存溢出?

send_buffer_limit 是什么,为什么它不解决内存溢出?

send_buffer_limit 是 Workerman 中 TcpConnection 对象的一个属性,表示该连接发送缓冲区的**软上限**(单位字节),默认值为 1024 * 1024 * 2(2MB)。但它**不是内存保护开关**——设了它,Workerman 不会主动拒绝数据、也不会提前断连;它只在每次调用 $connection->send() 后检查已缓存但尚未发出的数据量,若超限,就暂停该连接的后续 send,直到已有数据被系统 TCP 栈消费掉、缓冲区回落到阈值以下。

换句话说:send_buffer_limit 控制的是「发得慢一点」,不是「别让内存涨上去」。如果你的业务持续往一个卡住的连接狂塞大文件或高频消息,缓冲区会先顶到这个值,然后阻塞,但此时 PHP 用户态内存里已经存了大量待发送数据(比如 file_get_contents() 加载的整个文件),OOM 风险仍在。

真正导致 send 相关内存溢出的三个常见原因

  • 用 file_get_contents($path) + $connection->send() 发大文件:整份文件加载进 PHP 内存,再拷贝进连接发送缓冲区,双份占用
  • 客户端接收极慢或断连未及时检测(onClose 未触发),而服务端仍不断 send():数据越积越多,send_buffer_limit 只是延缓崩溃,不阻止累积
  • 批量广播时未做流控,10 万连接每人都 send 10KB,瞬间压爆内存:即使每个连接都低于 send_buffer_limit,总内存占用仍可能达 GB 级

怎么配 send_buffer_limit 才算合理?

配它不是为了防 OOM,而是为了给系统留出反应窗口。建议按连接平均带宽和网络 RTT 估算:

TextCortex
TextCortex

一款集AI写作、改写和知识辅助于一体的内容创作工具,可帮助用户快速完成多种类型的文本撰写与编辑任务。

下载
  • 对普通 WebSocket 聊天,设 1024 * 64(64KB)足够:消息小、交互快,缓冲区无需太大
  • 对文件传输类服务,可设 1024 * 1024 * 4(4MB),但必须配合 onBufferFull 回调做降级
  • 永远不要设为 0 或负数——这会让 Workerman 忽略该限制,失去最后的缓冲区水位提示
  • 必须在连接建立后、首次 send 前设置,例如在 onConnect 里:
    $connection->send_buffer_limit = 1024 * 1024 * 4;

注意:send_buffer_limit 是 per-connection 的,不能全局统一配置;Worker 进程启动时无法预设,只能靠业务逻辑动态赋值。

比配 send_buffer_limit 更关键的三件事

单靠这个参数根本挡不住内存爆炸。真正要做的:

  • 发文件改用 $connection->sendfile($filepath):内核零拷贝,完全绕过 PHP 用户内存,不占 memory_get_usage()
  • 所有 send() 调用前加判断:if (!$connection->isClosed() && $connection->getSendBufferSize() ,避免往已卡死的连接硬塞
  • 监听 onBufferFull 并主动干预:
    $connection->onBufferFull = function ($connection) {<br>    // 例:暂停该连接的消息推送,或记录告警<br>    $connection->pause();<br>};

最容易被忽略的是:send_buffer_limit 触发后,Workerman 不会自动清理已缓存数据,也不会释放连接——你得自己决定是 pause()、close(),还是切到备用通道。没这层响应逻辑,配再大的值也只是把崩溃时间推迟几秒而已。

相关专题

更多
Workerman安装配置教程
Workerman安装配置教程

Workerman安装配置教程专题提供Workerman安装配置、WebSocket开发、TCP通信、异步编程、高并发服务搭建与PHP实时通信开发教程。

2026.05.20

166

15

Workerman实时通信与长连接开发教程
Workerman实时通信与长连接开发教程

WWorkerman实时通信与长连接开发教程聚合实时通信、聊天室、长连接、消息推送、AI流式输出等Workerman高并发开发内容。

2026.05.20

202

12

Workerman异步通信与TCP服务器开发
Workerman异步通信与TCP服务器开发

Workerman异步通信与TCP服务器开发专题整理Workerman异步通信、TCP服务、HTTP服务、WebSocket开发与高并发PHP服务器教程。

2026.05.20

187

13

LLVM自定义Pass怎么写
LLVM自定义Pass怎么写

本专题聚焦LLVM自定义Pass开发,整理Pass类结构、run()方法、PreservedAnalyses、CMake构建、插件注册、-load-pass-plugin加载和测试用例编写流程。

2026.09.30

60

10

LLVM RISC-V参数配置教程
LLVM RISC-V参数配置教程

本专题介绍LLVM对RISC-V基础ISA和扩展的支持方式,涵盖RV32、RV64、标准扩展、实验性扩展、厂商扩展、-menable-experimental-extensions和版本差异。

2026.09.30

40

14

LLVM IR中间表示入门指南
LLVM IR中间表示入门指南

本专题整理LLVM IR的核心概念,包括中间表示作用、模块结构、函数、基本块、SSA形式、类型系统和常见语法,帮助新手理解LLVM编译流程中的关键层。

2026.09.30

40

12

PDF转图片方法
PDF转图片方法

需要把 PDF 页面用于上传、预览、分享或图片归档时,PDF 转图片方法专题整理 JPG/PNG 格式选择、逐页导出、清晰度设置、批量下载和结果检查等流程,帮助用户稳定完成 PDF 图片化处理。

2026.09.30

40

26

PixTV AI视频生成与无限画布创作
PixTV AI视频生成与无限画布创作

PixTV专题整理AI视频与视觉内容创作相关功能使用教程,涵盖AI生图、视频生成、无限画布、多模型创作、素材管理、声音音乐及视频剪辑等功能,帮助用户快速掌握PixTV从创意到成片的完整制作方法。

2026.09.29

40

15

Buffalo框架数据库开发全教程
Buffalo框架数据库开发全教程

本专题围绕Buffalo框架数据库开发,讲解database.yml多环境配置、soda与fizz迁移生成回滚、模型结构体标签、增删改查与条件查询、一对多与多对多关联、数据校验、回调钩子、事务处理及原生SQL执行能力。

2026.09.23

240

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Webman中文手册
Webman中文手册

共0课时 | 0人学习

Workerman官方手册
Workerman官方手册

共0课时 | 0人学习

ThinkPHP5.1完全开发手册
ThinkPHP5.1完全开发手册

共0课时 | 0人学习