要让PHP服务扛住数万并发连接,必须使用Workerman替代传统FPM模型;其依赖pcntl和posix扩展,推荐启用libevent扩展,并通过git克隆纯PHP实现的框架,避免Web路径暴露src目录。

要让PHP服务扛住数万并发连接,必须绕开传统FPM模型的阻塞式请求处理——Workerman通过常驻内存+事件循环+多进程架构,在不依赖额外扩展的前提下直接达成高并发Socket服务能力。
确认运行环境是否达标
Workerman最低要求PHP 5.3,但【必须启用pcntl和posix扩展】,否则启动时会直接报错Fatal error: Call to undefined function pcntl_fork()。可通过php -m | grep -E "pcntl|posix"验证;若缺失,需重新编译PHP或在CentOS上执行yum install php-process -y。
libevent扩展不是强制项,但启用后能显著提升事件循环效率,尤其在Linux高并发场景下。安装命令为pecl install libevent,完成后echo "extension=libevent.so" > /etc/php.d/libevent.ini。
获取并初始化Workerman框架
进入项目根目录,执行git clone https://github.com/walkor/Workerman,克隆完成后cd Workerman。
无需Composer依赖管理——Workerman是纯PHP实现,src/Worker.php即核心入口文件,所有功能均由此加载,vendor目录完全不需要。
这一步操作起来很简单,直接把文件拖进去就行,但注意不要把整个Workerman目录放在Web可访问路径下(如/var/www/html),否则src/目录可能被直接暴露。
编写第一个TCP Socket服务
在Workerman根目录新建test_socket.php,内容如下:
require_once './src/Worker.php';
$worker = new Worker('tcp://0.0.0.0:1234');
$worker->count = 4;
$worker->onConnect = function($connection) {
$connection->send("Welcome to Workerman TCP Server!\n");
};
$worker->onMessage = function($connection, $data) {
$connection->send("Echo: " . $data);
};
Worker::runAll();
关键点:协议地址必须写成tcp://0.0.0.0:1234而非localhost或127.0.0.1——后者仅监听本地回环,外部机器无法连接。
进程数$worker->count设为4是保守值,实际应按CPU核心数×2设置,例如4核服务器建议设为8;设得过小会浪费资源,过大则引发进程调度开销上升。
启动与验证服务
第一步:执行php test_socket.php start启动服务(开发调试用);
第二步:执行netstat -tuln | grep :1234确认端口已监听;
第三步:用telnet 127.0.0.1 1234测试连通性,输入任意字符后应收到Echo响应。
如果启动失败提示“Address already in use”,说明端口被占用,换一个端口号即可,比如1235或2346。
后台运行需加-d参数:php test_socket.php start -d,此时服务脱离终端持续运行,关闭SSH窗口不影响服务存活。

















