Workerman 5.2.3 搭建基础 TCP 服务只需创建 Worker 实例、绑定 tcp://0.0.0.0:2345 地址、注册 onConnect/onMessage/onClose 回调,并调用 Worker::runAll() 启动;需 PHP ≥7.4(推荐8.0/8.1)、启用 pcntl 和 posix 扩展,通过 Composer 安装,防火墙放行端口,避免阻塞操作与跨回调引用连接对象。

Workerman 5.2.3 搭建基础 TCP 服务非常直接,核心是创建 Worker 实例、绑定协议地址、注册事件回调,最后调用 Worker::runAll() 启动。它不依赖 Web 服务器(如 Nginx),纯 PHP 进程即可监听端口并处理连接。
准备运行环境
确保满足以下硬性条件,否则进程无法启动或报错难以排查:
- PHP 版本 ≥ 7.4(推荐 8.0/8.1),Workerman 5.2.3 已全面兼容 PHP 8.x
- 必须启用
pcntl和posix扩展(Linux/macOS 必需;Windows 仅支持单进程调试) - 通过 Composer 安装:
composer require workerman/workerman:5.2.3 - 确认防火墙放行目标端口(如 2345),避免 telnet 测试时连接被拒
编写服务端代码(server.php)
以下是最简可用的 TCP 服务脚本,已适配 Workerman 5.2.3 的命名空间和写法:
<?php
use Workerman\Worker;
require_once __DIR__ . '/vendor/autoload.php';
// 创建监听 tcp://0.0.0.0:2345 的 Worker
$worker = new Worker('tcp://0.0.0.0:2345');
$worker->name = 'TcpServer';
$worker->count = 2; // 启动 2 个子进程,提升并发能力
// 新连接建立时触发
$worker->onConnect = function ($connection) {
echo "✅ [{$connection->getRemoteIp()}] 已连接\n";
$connection->send("欢迎!请输入消息,输入 'quit' 退出。\n");
};
// 收到客户端数据时触发
$worker->onMessage = function ($connection, $data) {
$data = trim($data);
if ($data === 'quit') {
$connection->close();
return;
}
$connection->send("服务端收到:{$data}\n");
};
// 连接关闭时触发
$worker->onClose = function ($connection) {
echo "❌ [{$connection->getRemoteIp()}] 已断开\n";
};
// 启动服务
Worker::runAll();
保存为 server.php,终端执行:php server.php start(Linux/macOS)或 php server.php start -d(后台守护模式)。
用 telnet 或自定义客户端测试
无需额外开发,系统自带工具即可验证:
- 新开终端执行:
telnet 127.0.0.1 2345 - 连接成功后输入任意文本(如
hello),应立即收到服务端回显 - 输入
quit可主动断开,服务端会输出断开日志
若需程序化测试,可参考官方 AsyncTcpConnection 编写 PHP 客户端,但对基础验证非必需。
关键注意事项
这些细节在 5.2.3 中依然关键,忽略易导致服务不可靠:
- 不要在 onMessage 中执行阻塞操作(如 file_get_contents、sleep、MySQL 同步查询),否则会卡住整个进程;需改用异步 MySQL(如 Swoole MySQL 协程)或投递到独立进程
- 连接对象($connection)不能跨回调持久化引用,例如不能存入全局数组再 later 调用 send —— 必须在有效生命周期内操作
- onWorkerStart 是进程级初始化入口,适合加载配置、连接 Redis/MySQL 连接池(注意连接需支持复用)
- 生产环境务必加日志(
Worker::$logFile)、监控存活状态,并用 Supervisor 或 systemd 管理进程

















