优先通过宝塔软件商店一键安装swoole扩展;若失败或需特定版本(如swoole-5.1.5),则必须源码编译,严格校验phpize与php-config路径(如/www/server/php/80/bin/phpize),并确保cli与fpm的php.ini均添加extension=swoole.so后重启php服务。

在宝塔面板中部署Swoole扩展并对接消息队列(如Redis或Beanstalkd),是实现PHP应用异步处理任务(如发邮件、推通知、处理订单)的关键一步。你已配置好PHP 8.0环境,但执行php artisan queue:work时报错“Class 'Swoole\Coroutine' not found”,说明Swoole未正确加载或版本不兼容。
确认PHP版本与Swoole兼容性
登录SSH,执行/www/server/php/80/bin/php -v,确认输出为PHP 8.0.x(非8.1或7.4)。若显示其他版本,需先在宝塔「软件商店」→「PHP 80」→「设置」→「设置为默认版本」。
【必须匹配】 Swoole 5.x仅支持PHP 8.0+,且要求编译时使用的phpize和php-config路径严格对应/www/server/php/80/目录,错一位(如写成81或漏/bin/)会导致.so文件无法被识别。
优先尝试宝塔软件商店一键安装
进入宝塔面板 → 左侧「软件商店」→ 在「已安装」列表中找到「PHP 80」→ 点击右侧「设置」→ 切换到「安装扩展」选项卡 → 搜索框输入swoole → 若出现「Swoole5」或「Swoole4」选项,点击「安装」。
安装完成后,**必须点击「重启PHP」按钮(不是「重载配置」)**,否则新扩展不会载入运行时。
验证命令:/www/server/php/80/bin/php --ri swoole。若输出含enabled和版本号(如Version => 5.1.5),说明CLI环境已就绪。
手动编译安装(当软件商店无选项时)
方法一:用pecl自动安装(推荐)
执行/www/server/php/80/bin/pecl install swoole。安装过程中按提示输入y启用openssl、sockets等特性。成功后终端会输出一行extension=swoole.so,**立即复制该行内容**。
方法二:源码编译(需指定版本)
① 进入临时目录:cd /www/server
② 下载指定版本(如swoole-5.1.5):wget https://pecl.php.net/get/swoole-5.1.5.tgz
③ 解压并进入:tar -zxvf swoole-5.1.5.tgz && cd swoole-5.1.5
④ 用PHP 8.0专属工具链编译:/www/server/php/80/bin/phpize && ./configure --with-php-config=/www/server/php/80/bin/php-config --enable-openssl && make && make install
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
编译成功后,终端最后一行会显示Installing shared extensions: /www/server/php/80/lib/php/extensions/no-debug-non-zts-20200930/,记下该路径。
双php.ini同步启用扩展
宝塔中PHP-FPM(Web请求)与CLI(命令行)使用不同配置文件,必须同时修改:
编辑CLI配置:vi /www/server/php/80/etc/php.ini,在文件末尾新增一行:extension=swoole.so(若用pecl安装,直接粘贴上一步复制的整行)。
编辑FPM配置:vi /www/server/php/80/etc/php-fpm.d/www.conf,在[www]段落内添加:php_admin_value[extension] = swoole.so;或更稳妥地,在/www/server/php/80/etc/php.ini(FPM实际加载的主ini)末尾同样追加extension=swoole.so。
【不可跳过】 修改后必须在宝塔面板中点击「PHP 80」→「重启」,重载配置无效。
验证Swoole与消息队列联动
创建测试文件/www/wwwroot/test.swoole/queue_test.php:
<?php
if (!extension_loaded('swoole')) { die('Swoole extension not loaded'); }
use Swoole\Coroutine\Redis;
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
var_dump($redis->lpush('queue:mail', json_encode(['to'=>'test@example.com'])));
访问该URL或执行/www/server/php/80/bin/php /www/wwwroot/test.swoole/queue_test.php,输出整数即表示Swoole协程Redis客户端可正常写入队列。










