必须优先通过宝塔软件商店安装Swoole扩展,因其已预编译并默认启用--enable-openssl和--enable-http2;仅当商店无对应版本时才手动编译,且须严格匹配PHP路径、安装openssl-devel或libssl-dev、执行phpize、configure时加入--enable-openssl--enable-http2--enable-coroutine、双php.ini添加extension=swoole.so并重启PHP服务。

在宝塔面板中为PHP安装Swoole扩展并启用OpenSSL支持,是实现WebSocket over HTTPS(wss)、HTTPS服务器、HTTP/2等安全通信功能的前提;漏掉OpenSSL会导致swoole_http_server()函数不可用、wss连接被拒绝、证书握手失败却无明确报错。
先确认是否真要手动编译
登录宝塔面板 →「软件商店」→ 找到你当前使用的PHP版本(例如PHP 80)→ 点击「设置」→ 切换到「安装扩展」标签页 → 搜索“swoole”。
如果列表中出现Swoole4或Swoole5且状态为“未安装”,直接点击安装 → 安装完成后务必点「重启 PHP」(不是重载)。
【能用软件商店就别手动编译】——它已预编译并默认启用--enable-openssl和--enable-http2,路径、ini配置、双环境(CLI/FPM)都自动处理。只有搜不到对应项时,才进入下一步。
手动编译前的强制准备
执行:/www/server/php/80/bin/php -v,确认输出含“8.0.x”,数字“80”必须与你实际PHP版本严格一致;若用的是PHP 81或74,后面所有路径里的“80”要同步替换。
检查系统是否装有OpenSSL开发包:CentOS/RHEL运行yum install -y openssl-devel,Ubuntu/Debian运行apt-get install -y libssl-dev。没装会导致configure静默跳过--enable-openssl,后续功能全失效。
验证PHP自身是否加载了openssl扩展:/www/server/php/80/bin/php -r "echo extension_loaded('openssl') ? 'yes' : 'no';"。输出no说明PHP底层不支持SSL,Swoole即使编译进OpenSSL也跑不起来。
源码编译并启用OpenSSL
第一步:进入PHP对应目录并下载源码
cd /www/server/php/80 && wget https://pecl.php.net/get/swoole-5.1.5.tgz && tar zxvf swoole-5.1.5.tgz && cd swoole-5.1.5
第二步:生成编译配置/www/server/php/80/bin/phpize
第三步:执行configure,关键参数一个都不能少./configure --with-php-config=/www/server/php/80/bin/php-config --enable-openssl --enable-http2 --enable-coroutine
PHP 8.5+必须加--enable-coroutine,否则Swoole\Coroutine::sleep()直接报not available;漏掉--enable-openssl或--enable-http2,swoole_http_server类和wss将完全不可用。
第四步:编译安装make clean && make && make install
成功后终端会输出类似:Installing shared extensions: /www/server/php/80/lib/php/extensions/no-debug-non-zts-20200930/——这个路径必须记牢。
配置php.ini并验证
方法一:宝塔图形界面操作
面板中打开「PHP设置」→「配置文件」→ 拉到底部添加一行:extension=swoole.so → 保存 → 点「重启PHP」。
方法二:命令行双文件补全(更稳妥)
编辑FPM配置:sed -i '$a extension=swoole.so' /www/server/php/80/etc/php.ini
编辑CLI配置:sed -i '$a extension=swoole.so' /www/server/php/80/bin/php.ini
【只改其中一个php.ini,php --ri swoole必报not found】
验证是否生效:/www/server/php/80/bin/php --ri swoole | grep -E "(openssl|http2|coroutine)"。输出中必须同时出现“openssl => enabled”、“http2 => enabled”、“coroutine => enabled”,才算真正启用。










