workerman进程常驻内存,启动后持续运行直至手动停止,不随请求结束销毁;其通过事件循环复用内存、连接与资源,避免php-fpm每次请求重建环境的开销。

Workerman进程不随请求结束而销毁
Workerman启动后,Worker 进程会一直运行在内存中,直到你手动执行 php start.php stop 或系统 kill 掉进程。它不会像 PHP-FPM 那样——每个 HTTP 请求进来,就 fork 一个子进程、加载一次全部代码、执行完立刻释放内存。这意味着你在 onWorkerStart 里初始化的类实例、全局变量、数据库连接、Redis 客户端等,只要没被显式销毁,就会一直保留在该 Worker 进程的内存空间里。
传统PHP-FPM每次请求都重建整个运行环境
PHP-FPM 模式下,哪怕只是访问一个 index.php 输出 "hello",也会经历:加载 PHP 解析器 → 加载所有 include/require 文件 → 构建符号表 → 执行脚本 → 销毁全部变量和对象 → 释放内存。这个过程每秒可能重复几百次,开销集中在文件 I/O 和 opcode 编译上。而 Workerman 只在启动时做一次完整加载,后续所有连接复用同一份内存中的类定义和已编译 opcode。
常驻内存带来的直接后果
- 修改 PHP 业务代码后,
php start.php reload或php start.php restart是必须的,否则新代码永远不会生效 - 不能在
onMessage中用new创建大量长期存活的对象而不释放,否则会累积导致内存溢出 - 数据库连接不能在
onMessage中反复new PDO(),必须在onWorkerStart中创建并复用,否则很快耗尽 MySQL 连接数 -
static属性或全局数组在单个 Worker 内跨连接共享,但不同 Worker 进程之间完全隔离,不能直接用于跨进程状态同步
事件循环让“常驻”真正可用
光是常驻还不够,关键在于 Workerman 的事件循环(基于 select/epoll 等)让单个进程能同时处理成千上万个连接。它不靠多线程抢占 CPU,而是靠非阻塞 I/O + 回调调度。比如一个 WebSocket 连接保持 1 小时,期间只在有数据来或断开时触发 onMessage 或 onClose,其余时间进程仍在监听其他连接,CPU 几乎不占用。这才是“常驻内存”不等于“占满内存”的根本原因。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











