Workerman 4.0.40 是专为高并发网络服务设计的常驻内存框架,要求 PHP ≥7.1(推荐8.0+)、启用 pcntl/posix 扩展,官方不支持 Composer 安装,须通过 git clone 或 GitHub ZIP 获取源码,并严格按顺序编写 start.php 启动 TCP 服务。

你想用 PHP 写一个能同时撑住上万连接的聊天服务器、实时推送服务或物联网网关,但又卡在“PHP 不是只能跑网页吗”这个认知里——Workerman 4.0.40 就是专为打破这种限制而生的常驻内存框架,它不依赖 Nginx、不走 FPM、不靠轮询,靠的是进程常驻 + 事件循环 + 多路复用,把 PHP 变成真正意义上的网络服务语言。
确认运行环境是否达标
Workerman 对底层扩展有硬性要求,缺一不可:【pcntl 和 posix 扩展必须启用】。这两个扩展控制进程创建与信号处理,Linux/macOS 下默认不开启,Windows 仅支持调试,严禁上线。
执行 php -m | grep -E "pcntl|posix" 查看是否已加载。若无输出,需重新编译 PHP 或修改 php.ini:取消 extension=pcntl 和 extension=posix 前的分号,并确保 safe_mode = Off。
PHP 版本必须 ≥ 7.1(Workerman 4.0.40 实际推荐 8.0+),低于此版本会直接报错退出,且无法降级兼容。
获取官方源码(禁用 Composer)
Workerman 官方【未发布任何 Composer 包】,所有通过 composer require workerman/workerman 安装的行为,均可能拉取到非官方 fork、空包或旧版镜像,导致 autoload 失败、Worker::runAll() 找不到、甚至静默崩溃。
方法一:直接克隆官方仓库
执行 git clone https://github.com/walkor/Workerman.git ./Workerman,路径必须为项目根目录下的 ./Workerman,否则后续 require_once './Workerman/Autoloader.php' 会失败。
方法二:手动下载 ZIP
访问 GitHub v4.0.40 发布页,下载 zip 包解压到项目根目录,重命名为 Workerman(大小写敏感,不能是 workerman 或 Workerman-master)。
写出第一个可运行的 TCP 服务
在项目根目录新建 start.php,内容严格按以下顺序书写(顺序错则类找不到):
① 第一行必须是 <?php
② 第二行写 use Workerman\Worker;
③ 第三行写 require_once './Workerman/Autoloader.php';
④ 创建 Worker 实例:$worker = new Worker('tcp://0.0.0.0:1234');
⑤ 绑定 onMessage 回调:$worker->onMessage = function($connection, $data) { $connection->send("Received: " . $data); };
⑥ 最后调用 Worker::runAll();
这六步缺一不可。其中 tcp://0.0.0.0:1234 表示监听本机所有 IPv4 地址的 1234 端口;若改用 127.0.0.1:1234,则外部机器无法连接。
启动并验证服务是否存活
终端进入项目根目录,执行:php start.php start(开发模式)或 php start.php start -d(守护进程模式)。
若看到输出 Workerman[xxx] start in daemon mode 或 Workerman[xxx] start in debug mode,说明主进程已启动。
立刻用另一终端测试连接:telnet 127.0.0.1 1234。成功后输入任意字符(如 hello),回车,应收到 Received: hello。若提示 Connection refused,90% 是防火墙拦截、云服务器安全组未放行 1234 端口,或非 root 用户尝试监听 1024 以下端口(此时请换用 2000 以上端口)。
理解 Master-Worker 进程结构
执行 ps aux | grep start.php,你会看到至少两个 PHP 进程:
— 一个标记为 Master 的进程(负责监控、重启、平滑 reload)
— 至少一个标记为 Worker 的子进程(实际处理 socket I/O)
Worker 进程数量默认为 1,可通过 $worker->count = 4; 设为 4 个——这会让每个 Worker 独立监听同一端口,由内核负载均衡分发连接,真正利用多核 CPU。
注意:【Worker 进程崩溃时,Master 会自动拉起新进程,但 onWorkerStart 回调不会再次触发】,因此数据库连接、全局缓存初始化等操作必须放在 $worker->onWorkerStart 回调里,而非文件顶层代码中。

















