PHP本身不原生支持WebSocket,必须依赖Swoole、Workerman等扩展或框架以CLI常驻进程方式运行,通过事件驱动实现长连接与双向通信。

phpEnv 默认不支持 WebSocket,因为它本质是 Apache + PHP-FPM 的集成包,而 WebSocket 服务必须以 CLI 模式常驻运行、自行监听 TCP 端口——这点和 HTTP 服务完全冲突。直接把 websocket_server.php 放进网站根目录、用浏览器访问,必然失败。
phpEnv 能不能跑 WebSocket?取决于你用什么方式启动
phpEnv 本身不提供 Swoole/Workerman 运行环境,但它的 PHP CLI 是可用的(前提是没被阉割)。关键看两点:
- PHP 是否已启用
sockets扩展(绝大多数 phpEnv 自带,无需额外开启) - 是否手动安装了
swoole或workerman(phpEnv 默认不含这两个扩展)
如果你只是想验证握手逻辑或写个玩具 demo,用原生 socket_create() 是可行的;但要稳定支撑在线聊天、消息推送等场景,必须补上 Swoole —— 否则你会反复遇到连接闪断、并发卡死、无法处理掩码帧等问题。
在 phpEnv 中启用 Swoole 的实际步骤
phpEnv 的 PHP 是静态编译的,不能像宝塔那样一键安装扩展。你得手动编译 Swoole 并指向 phpEnv 的 PHP 目录:
立即学习“PHP免费学习笔记(深入)”;
- 下载对应 PHP 版本的 Swoole 源码(例如 phpEnv 用的是 PHP 8.1,则必须选 Swoole 4.8+)
- 执行:
phpize→./configure --with-php-config=/path/to/phpenv/php/bin/php-config→make && make install - 编辑 phpEnv 自带的
php.ini(通常在/php/ext/php.ini),添加:extension=swoole - 重启 phpEnv 的 Apache 无用,重点是确认 CLI 下生效:
php -m | grep swoole有输出才算成功
漏掉最后一步验证,90% 的“Connection refused”错误都源于此——你以为装上了,其实 php /path/to/server.php 启动时根本没加载扩展。
启动服务时最容易忽略的三个限制
即使 Swoole 装好了,phpEnv 环境下仍会因默认配置踩坑:
- 防火墙默认封锁非标准端口(如
9501),需手动放行;Windows 用户还要检查“Windows Defender 防火墙”是否拦截了php.exe - phpEnv 的 Apache 占用了
80和443,WebSocket 服务必须避开,推荐用20000~65535范围内的端口(如23456) - Windows 下无法用
supervisor,得改用winser或srvany将 PHP 进程注册为 Windows 服务,否则关掉命令行窗口服务就终止
别指望 phpEnv 图形界面里点几下就能托管 WebSocket 进程——它没这个设计,所有守护逻辑必须自己补全。
前端连不上?先确认 ws:// 地址是否被 Apache 劫持
很多人把 WebSocket 服务绑在 0.0.0.0:23456,却在前端写 ws://localhost/chat,结果 404。原因很简单:phpEnv 的 Apache 正在监听 localhost:80,而浏览器看到 ws://localhost 默认尝试走 80 端口,根本没发到你的 CLI 服务去。
正确写法只有两种:
-
ws://127.0.0.1:23456(绕过 Apache,直连 PHP CLI 服务) - 配 Nginx 反向代理(phpEnv 不自带 Nginx,需额外部署)
用 localhost 而不是 127.0.0.1 是很多人的惯性操作,但在 phpEnv 这种多服务共存环境里,它就是个隐形陷阱。



















