必须用--with-php-config指定php实例路径,否则编译会链接系统默认php导致版本不匹配;make install输出的扩展目录才是swoole.so真实路径,需在php.ini中正确配置extension_dir或写绝对路径引用。

configure 时必须用 --with-php-config 指定 PHP 构建环境
自定义 Swoole 安装目录,本质不是改 swoole.so 放哪,而是让编译过程知道该链接哪个 PHP 实例。如果你源码安装了 PHP 到 /home/work/study/soft/php,那 ./configure 就必须指向它的 php-config,否则会默认找系统自带 PHP(比如 /usr/bin/php-config),导致扩展加载失败或版本不匹配。
常见错误现象:make install 后 php -m 找不到 swoole,或报 undefined symbol: php_pcre_exec 类似符号缺失错误——这基本是 PHP 主体和扩展用了不同版本的头文件或 ABI。
-
./configure --with-php-config=/home/work/study/soft/php/bin/php-config是唯一可靠方式,不能省略 - 不要用
--prefix控制 swoole 安装路径:它对扩展无效;make install输出的 “Installing shared extensions” 路径才是真实 so 文件落点 - 执行完
make install后,终端会打印类似Installing shared extensions: /home/work/study/soft/php/lib/php/extensions/no-debug-non-zts-20210902/的路径,记下这个目录
php.ini 中 extension 必须写绝对路径或仅文件名(取决于 PHP 版本)
PHP 加载扩展时,extension=swoole 和 extension=/full/path/to/swoole.so 行为不同。从 PHP 7.4 开始,默认启用 extension_dir 自动拼接,所以写 extension=swoole 即可;但老版本(如 7.2 或某些定制包)可能要求写全路径,否则报 Failed loading swoole.so: file not found。
验证当前行为最简单的方法是运行:php -i | grep extension_dir,再检查该目录下是否存在 swoole.so。如果存在且你写了 extension=swoole 却不生效,大概率是 PHP 版本太老或 extension_dir 配置被覆盖。
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- 推荐统一写绝对路径:
extension=/home/work/study/soft/php/lib/php/extensions/no-debug-non-zts-20210902/swoole.so - 修改前先确认 php.ini 是当前 PHP 实际加载的配置:
php --ini,别改错文件(比如改了 CLI 的,却用 FPM 运行) - 改完
php.ini不需要重启 nginx/apache,但 CLI 下要重新运行命令;FPM 需要systemctl reload php-fpm或对应服务
make install 输出的 so 路径不可手动挪动
有人想把生成的 swoole.so 复制到其他目录(比如 /usr/lib/php/modules/),再在 php.ini 里写新路径——这极大概率失败。因为 swoole.so 编译时绑定了其构建时的 PHP ABI 版本号(如 no-debug-non-zts-20210902),也依赖同目录下的 opcache.so 等运行时符号。手动移动后,PHP 加载时找不到匹配的 ABI 子目录,或符号解析失败。
正确做法只有一个:接受 make install 输出的路径,并确保 php.ini 中的 extension_dir 指向它,或直接写绝对路径引用它。
- 如果输出路径太长、难管理,可在
php.ini中显式设置:extension_dir = "/home/work/study/soft/php/lib/php/extensions/no-debug-non-zts-20210902/",然后用extension=swoole - 不要用软链绕过:PHP 加载器不跟随 symlink 解析 ABI 目录名,仍会报错
- 检查 so 文件权限:
ls -l /path/to/swoole.so,确保 PHP 进程用户(如 www-data 或 nobody)有读取权限
Windows 下 Cygwin 环境的路径陷阱
Cygwin 里看似 Linux 命令,但路径映射机制特殊:/usr/lib/php/20151012/swoole.so 在 Windows 实际对应 C:\cygwin64\usr\lib\php\20151012\swoole.so。如果在 php.ini 中写的是 Windows 风格路径(如 C:/cygwin64/usr/lib/...),PHP 会直接忽略——它只认 Cygwin 的 POSIX 路径格式。
更隐蔽的问题是:Cygwin 的 phpize 可能调用宿主机的 MSVC 编译器,而 PHP 本身是 MinGW 编译的,ABI 不兼容,导致 swoole.so 加载时报 invalid ELF header 或直接段错误。
- 务必用 Cygwin 自带的
gcc和phpize,不要混用 Windows 原生工具链 - 确认 PHP 是 Cygwin port 版本(
php -v显示built by Cygwin),而非 Windows 官方二进制 - 路径一律用
/usr/lib/...格式,不要转义空格或用盘符
php-config、php.ini、extension_dir、so 文件 ABI 四者之间的绑定关系。只要其中一环指向错误实例,整个安装就变成黑盒调试。










