phpenv默认不支持websocket长连接,必须手动启用swoole扩展并以cli方式运行服务,不可走apache/nginx;需下载匹配版本的swoole.dll、配置php.ini、放行端口,并用netstat/telnet验证监听状态。

phpEnv 默认不支持 WebSocket 长连接,必须手动启用 Swoole 扩展并绕过 Apache/Nginx 的 HTTP 生命周期限制——否则服务启动即死、连接秒断。
确认 phpEnv 是否已加载 Swoole 扩展
phpEnv 是 Windows 下的集成环境(类似 PHPStudy),默认只开 PHP-FPM + Apache/Nginx,swoole 扩展几乎肯定未启用。
检查方法:
- 运行
php -m | findstr swoole(Windows 命令行),无输出即未安装 - 访问
http://localhost/phpinfo.php,搜索swoole,没看到版本号说明未加载 - 常见错误:即使编译了
swoole.dll,若 PHP 版本(如 8.1 TS/NTS)与 dll 不匹配,php -v会直接报错退出
在 phpEnv 中启用 Swoole 的实操步骤
不能靠“一键安装”——phpEnv 的扩展管理器通常不包含 Swoole。必须手动下载对应版本的 swoole.dll 并配置。
- 去 PECL 官网 或 GitHub Releases 下载与你 phpEnv 中 PHP 版本、线程安全(TS/NTS)、架构(x64/x86)完全一致的
swoole.dll - 将 dll 放入
php/ext/目录(例如C:\phpEnv\php\ext\swoole.dll) - 编辑对应 PHP 版本的
php.ini(注意:Apache 和 CLI 可能用不同 ini 文件),添加一行:extension=swoole - 重启 phpEnv 的 Apache 和 PHP 服务;再执行
php -m确认swoole出现在列表中
启动 WebSocket 服务必须走 CLI,不能走 Web 服务器
这是最常踩的坑:把 websocket_server.php 放进网站根目录,然后用浏览器访问 —— 完全无效。PHP-FPM/Apache 会在几秒内强制终止脚本,$server->start() 根本跑不起来。
- WebSocket 服务必须在命令行下长期运行:
php C:\phpEnv\www\websocket_server.php - 一旦关闭终端,服务立即退出;生产环境需用
screen(Linux)或WinSW(Windows)守护进程 - phpEnv 自带的“服务管理”界面无法托管此类常驻进程,别指望它能“启动 WebSocket 服务”
- 端口(如
9501)需在 Windows 防火墙和 phpEnv 的“端口映射”里放行,否则前端new WebSocket("ws://127.0.0.1:9501")会报Connection refused
前端连接前,先验证服务是否真在监听
别急着写 JS,先用最简方式确认后端活得好好的。
- 启动服务后,执行
netstat -ano | findstr :9501,能看到LISTENING状态和对应 PID - 用 telnet 测试基础连通:
telnet 127.0.0.1 9501—— 如果闪退或报错,说明服务没起来或端口被占 - 前端 JS 必须用
ws://(非http://),且地址要和服务器实际监听地址一致;本地开发时ws://localhost:9501和ws://127.0.0.1:9501在某些环境下行为不同 - 若浏览器控制台报
Error during WebSocket handshake: Unexpected response code: 400,大概率是 Nginx/Apache 拦截了升级请求——但 phpEnv 默认没配反向代理,此错误多因服务根本没响应导致
真正难的不是写几行 $server->on('message'),而是让这个进程在 Windows 后台安静活过一整天不崩、不丢连接、不爆内存。Swoole 的 worker_num、max_conn、heartbeat_idle_time 这些参数调不好,撑不过百人并发。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











