php -m 看不到 swoole 是因 cli 使用了系统默认 php 而非宝塔的 php 8.0;需用 /www/server/php/80/bin/php -m 验证,确认 cli 和 fpm 的 php.ini 均启用 extension=swoole.so 并重启服务。

php -m 看不到 swoole 扩展?先确认 CLI 用的是哪个 PHP 版本
宝塔面板里 PHP 8.0 装好了,但命令行运行 php -m 就是不显示 swoole,十有八九不是扩展没装,而是你当前终端跑的是系统默认的 PHP(比如 PHP 7.4),压根没走宝塔的 PHP 8.0。
- 运行
which php和php -v看实际版本 - 宝塔的 PHP CLI 路径通常是
/www/server/php/80/bin/php,直接用它执行:/www/server/php/80/bin/php -m | grep swoole - 如果输出了
swoole,说明扩展已装好;没输出,再查/www/server/php/80/bin/php --ini看加载的php.ini是哪个,确认里面写了extension=swoole.so - 别只改 FPM 的
php.ini,CLI 和 FPM 是两套配置,都要检查
Class 'Swoole\Server' not found 错误怎么破
写了个 server.php,一运行就报这个错,核心原因只有两个:扩展没启用,或命名空间写错(尤其老教程混用 swoole_server)。
- PHP 8.0 必须用完整命名空间:
Swoole\Server、Swoole\WebSocket\Server,不能再用废弃的全局类名swoole_server - 检查
/www/server/php/80/etc/php.ini(CLI 配置)和/www/server/php/80/etc/php-fpm.d/www.conf(FPM 配置)是否都加了extension=swoole.so - 改完配置必须重启服务:
bt restart或在宝塔面板点「重启 PHP」,光 reload 不生效 - 验证是否加载成功:
/www/server/php/80/bin/php -r "echo extension_loaded('swoole') ? 'yes' : 'no';"输出yes才算过关
telnet 127.0.0.1 9501 没反应?端口监听可能被限制
脚本跑起来没报错,但 telnet 连不上,不代表代码错了,很可能是端口没真正监听,或被防火墙/SELinux 拦了。
- 先确认进程是否真在跑:
ps aux | grep server.php,看到类似/www/server/php/80/bin/php server.php才算活的 - 查端口监听:
lsof -i :9501或netstat -tlnp | grep :9501,没有输出说明 Swoole 根本没 bind 成功(常见于权限、端口占用、IP 绑定错误) - 绑定
0.0.0.0比127.0.0.1更稳妥,尤其在容器或某些虚拟网络环境下 - 宝塔默认关了外网访问,测试时用
127.0.0.1即可;若要从宿主机外访问,得在宝塔「安全」里放行端口,且确认服务器防火墙(firewalld或ufw)也开了
WebSocket 测试连不上?别跳过 on('Open') 的响应校验
写了个 ws_server.php,浏览器用 new WebSocket('ws://127.0.0.1:9502') 连,控制台报 failed: Error during WebSocket handshake,大概率是握手阶段就失败了。
- Swoole WebSocket Server 默认不自动处理 HTTP Upgrade 请求,必须显式监听
on('Open')事件,哪怕只写空函数:$ws->on('Open', function() {}); - 确保客户端 URL 协议是
ws://(非http://),端口与服务端一致,且服务端未限制 Origin(开发期可临时加$ws->set(['websocket_compression' => false]);排查) - 调试时加日志:
$ws->on('Open', function($ws, $request) { var_dump($request->fd, $request->header); });,能看到连接进来才算握手成功 - 别在浏览器直接输
ws://...地址——这不合法,必须用 JS new WebSocket() 触发
最常卡住的地方不是编译或配置,而是 CLI/FPM 环境不一致、命名空间大小写、以及监听地址绑定到 127.0.0.1 后忘了 telnet 只能本地连——这些细节不手动验证一遍,光看“没报错”就以为成了。










