php -m 看不到 swoole 表明扩展未加载,主因是 cli 与 web 环境 php.ini 不一致,需分别确认两者配置中均含 extension=swoole.so 并重启对应服务。

php -m 看不到 swoole,基本可以断定扩展根本没加载进 PHP 进程,不是代码问题,是环境配错了。
php -m 和 phpinfo() 显示不一致
这是最典型的线索:命令行 php -m 没输出 swoole,但浏览器里 phpinfo() 有 Swoole 模块——说明 CLI 和 Web(如 Nginx + PHP-FPM)用的是两套 php.ini,你只改了其中一个。
- 查 CLI 的配置:
php --ini看 “Loaded Configuration File”,再确认extension=swoole.so是否真写在那个文件里 - 查 Web 的配置:建个
info.php,<?php phpinfo(); ?>,浏览器打开后搜 “Loaded Configuration File”,检查该php.ini是否也加了extension=swoole.so - Ubuntu/Debian 上用
apt install php-swoole装的,会自动写到/etc/php/*/cli/conf.d/20-swoole.ini和/etc/php/*/fpm/conf.d/20-swoole.ini,但如果你手动编译安装,它不会自动同步到 FPM 配置目录
swoole.so 文件路径或权限不对
make install 成功不代表 swoole.so 就在 PHP 能找到的地方。PHP 启动时按 extension_dir 配置去加载,路径错、文件名错、权限不足都会静默失败。
- 运行
php -i | grep extension_dir,确认输出的路径下真有swoole.so(注意不是swoole.so.so) - 如果
make install输出类似Installing shared extensions: /usr/lib/php/20220829/,而你的extension_dir是/usr/lib/php/20210902/,就得手动拷过去 - 检查文件权限:
ls -l /path/to/swoole.so,确保 PHP 进程用户(如www-data或nginx)有读权限 - 别用相对路径写
extension=swoole.so;明确写全路径更可靠:extension=/usr/lib/php/20220829/swoole.so
PHP 版本与 Swoole 编译目标不匹配
哪怕 swoole.so 文件存在、路径正确、php.ini 也写了,PHP 仍可能跳过加载——因为 ABI 不兼容,比如 ZTS(线程安全)模式错位、PHP 主版本号不满足最低要求。
- 用
php -v确认 PHP 主版本(如 8.1),再查 Swoole 官方支持表:Swoole v5.x 要求 PHP ≥ 8.0,v4.10.x 支持 PHP 7.2–8.2,但 v4.8.x 就不支持 PHP 8.2 - 检查 ZTS:运行
php -i | grep "Thread Safety",结果是enabled表示 ZTS,disabled表示 NTS;编译时必须用对应模式的php-config,否则./configure --with-php-config=/usr/bin/php-config可能指向 NTS 版,而你跑的是 ZTS PHP-FPM - 验证是否 ABI 冲突:
php -d extension=swoole.so -m 2>&1 | head -5,如果报undefined symbol: zend_string_init_interned或类似,基本就是 PHP 扩展 API 版本不匹配
依赖库缺失导致动态链接失败
扩展文件存在、路径正确、版本也对,但 php -v 或 php-fpm 启动时报 undefined symbol 或直接静默跳过,大概率是 swoole.so 依赖的系统库没找到。
- 用
ldd /path/to/swoole.so | grep "not found"查缺失的 .so,常见有:libssl.so.1.1、libnghttp2.so、libpcre2-8.so.0 - Mac 上常见 OpenSSL 路径错位:编译时用了
--with-openssl-dir=/opt/homebrew/opt/openssl@3,但运行时找不到libssl.3.dylib,得补export DYLD_LIBRARY_PATH=/opt/homebrew/opt/openssl@3/lib:$DYLD_LIBRARY_PATH(仅临时调试,生产环境应重编译) - Linux 上不要靠
LD_LIBRARY_PATH修,优先用patchelf重写 rpath,或在php.ini中用绝对路径加载
最容易被忽略的是:PHP-FPM 和 CLI 的 php.ini 分属不同路径,且修改后必须分别重启对应服务(systemctl restart php-fpm 和 killall php 不等于重启 CLI 环境)。哪怕只差一行 extension=,也会让 class_exists('Swoole\Server') 始终返回 false。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











