必须同步完成swoole扩展安装与宝塔防火墙策略调整:一、通过软件商店一键安装或pecl/源码编译安装扩展;二、在php-cli.ini和php.ini中均添加extension=swoole.so并重启php;三、在宝塔安全中放行websocket端口(如9501)、关闭cc防护与恶意请求拦截。

要在宝塔面板中让Swoole扩展正常运行,同时确保WebSocket、协程HTTP服务器等能力不被宝塔防火墙拦截或误杀,必须同步完成扩展安装与防火墙策略调整。只装扩展不调防火墙,客户端连接会直接超时;只开防火墙不装扩展,则PHP层根本无法解析Swoole协议。
确认当前PHP版本并检查Swoole是否已预装
登录宝塔面板 → 左侧「软件商店」→ 找到你站点正在使用的PHP版本(例如PHP 82)→ 点击右侧「设置」→ 切换到「安装扩展」标签页 → 在搜索框输入swoole。
若列表中显示“Swoole5”或“Swoole4”,说明该PHP版本已被宝塔官方适配,直接点击安装即可;若为空白或提示“暂不支持”,则必须走命令行路径。
执行命令验证当前CLI PHP版本:/www/server/php/82/bin/php -v,输出必须含PHP 8.2.x字样,数字82不可错写为81或83。
手动安装Swoole扩展(适用于PHP 82等新版本)
方法一:用pecl自动安装(推荐首选)
① 确保编译环境就绪:执行yum install -y gcc gcc-c++ make autoconf(CentOS)或apt install -y build-essential autoconf(Ubuntu/Debian)。
② 切换至PHP 82环境并运行安装命令:/www/server/php/82/bin/pecl install swoole。
③ 安装过程中会交互询问是否启用http2、openssl、sockets等特性,全部按回车接受默认值即可——这些是WebSocket和HTTPS服务的硬性依赖,跳过会导致后续swoole_http_server函数不存在。
④ 成功后终端最后一行会输出类似extension=swoole.so的完整加载行,【必须复制这一整行】,后续要粘贴进两个配置文件。
方法二:源码编译(仅当pecl失败时启用)
下载PECL官方包而非GitHub源码:wget https://pecl.php.net/get/swoole-5.1.6.tgz → 解压:tar zxvf swoole-5.1.6.tgz && cd swoole-5.1.6 → 严格使用PHP 82工具链:/www/server/php/82/bin/phpize → 配置:./configure --with-php-config=/www/server/php/82/bin/php-config --enable-openssl --enable-http2 → 编译:make && make install。
注意:编译成功后终端会提示Installing shared extensions: /www/server/php/82/lib/php/extensions/no-debug-non-zts-20220829/,这个路径必须和下一步配置中的so文件位置一致。
双php.ini配置与重启生效
宝塔中CLI与FPM使用两套独立配置,漏改任一都会导致Web请求无法识别Swoole:
编辑CLI配置:vi /www/server/php/82/etc/php-cli.ini,在文件末尾新增一行extension=swoole.so。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
编辑FPM配置:vi /www/server/php/82/etc/php.ini,同样在末尾追加extension=swoole.so。
【必须点击宝塔面板中PHP 82右侧的「重启」按钮,不是「重载配置」】——重载不会重新加载扩展,仅重启能触发PHP进程完全重建。
验证是否生效:/www/server/php/82/bin/php --ri swoole,输出中必须含enabled和版本号,且support for openssl、support for http2均为enabled。
开放宝塔防火墙端口并禁用规则冲突
WebSocket和自定义TCP服务默认监听非标准端口(如9501、9502),这些端口在宝塔防火墙中默认被封锁:
进入宝塔面板 → 「安全」→ 「防火墙」→ 「放行端口」→ 输入要开放的端口号(例如9501、9502、8080),点击「放行」。
若使用HTTPS WebSocket(wss://),还需额外放行443端口,并确认SSL证书已正确绑定到对应域名。
关键动作:关闭「CC防护」和「恶意请求拦截」对目标端口的监控——这两项默认会对长连接、高频心跳包误判为攻击,导致WebSocket连接频繁断开。
操作路径:「安全」→ 「防火墙」→ 「CC防护」→ 将「开启状态」切换为关闭 → 同样进入「恶意请求拦截」→ 关闭「开启状态」→ 仅保留「IP黑名单」基础防护。
验证Swoole服务与防火墙联动效果
创建测试文件/www/wwwroot/your-site/test_swoole.php,内容为:
<?php echo extension_loaded('swoole') ? 'Swoole loaded' : 'Swoole not found'; ?>
浏览器访问https://your-domain.com/test_swoole.php,应返回Swoole loaded。
启动一个最简WebSocket服务:/www/server/php/82/bin/php -r "use Swoole\WebSocket\Server; \$server = new Server('0.0.0.0', 9501); \$server->on('start', fn() => print 'WS server started on port 9501'); \$server->start();"。
用telnet your-server-ip 9501测试端口连通性,能建立连接即表示防火墙放行成功;若提示Connection refused,说明端口未开放或PHP服务未真正运行。










