安装zlib开发包(如Ubuntu用sudo apt-get install zlib1g-dev,CentOS用sudo yum install zlib-devel),验证zlib.h存在后,configure需加--enable-zlib参数,再检查php --ri swoole输出及ldd链接结果。

configure 报错 “cannot find zlib.h” 怎么办
这是最常见的一类错误,不是 zlib 没装,而是开发头文件缺失。系统自带 zlib 运行时库(比如 libz.so),但编译 Swoole 需要的是 zlib.h 和配套的静态链接支持,属于 zlib1g-dev(Debian/Ubuntu)或 zlib-devel(CentOS/RHEL)包。
实操建议:
- Ubuntu/Debian:运行
sudo apt-get install -y zlib1g-dev - CentOS/RHEL:运行
sudo yum install -y zlib-devel或sudo dnf install -y zlib-devel - 验证是否装对:执行
find /usr -name zlib.h 2>/dev/null,应返回类似/usr/include/zlib.h的路径 - 如果 configure 仍找不到,可显式指定路径:
./configure --with-zlib-dir=/usr/include
php --ri swoole 显示 “zlib => disabled”
即使 configure 成功、make install 也完成,php --ri swoole 输出里 zlib 支持仍为 disabled,说明编译时没启用该模块,或者运行时加载了旧版 swoole.so(不含 zlib 支持)。
原因和对策:
Swoole 6.1.1 是一个专为 PHP 设计的高性能事件驱动并发网络引擎。作为稳定版,它修复了编译时对 zlib 依赖的缺失及 curl 模块的内存安全风险。该版本支持协程、多线程与多进程架构,内置 TCP/HTTP/WebSocket 服务器,能够显著提升 PHP 在微服务、实时通信等场景下的执行效率与并发能力。
- configure 阶段漏掉
--enable-zlib参数:Swoole 默认不开启 zlib 支持,必须显式加 —— 尤其是你要用Co\Http\Client的 gzip/deflate 自动解压,或Swoole\Http\Response->gzip() - 确认当前 PHP 加载的是你刚编译的
swoole.so:执行php --ri swoole | grep "extension",看输出的路径是否和php-config --extension-dir一致;若不一致,检查php.ini中extension=指向的路径 - 多个 PHP 版本共存时,
phpize和php-config错配会导致编译产物绑定错 ABI —— 运行which phpize和which php-config,确保二者路径前缀完全相同
Docker 环境中 zlib 依赖静默失败
在 Alpine 镜像里用 pecl install swoole 很容易“看似成功”,但实际没启用 zlib:musl libc 下的 zlib 实现和 glibc 不兼容,且 Alpine 的 zlib-dev 包名是 zlib-dev(不是 zlib1g-dev),缺它会导致 configure 跳过 zlib 支持,还不报错。
安全做法:
- Alpine 镜像优先用 apk 包管理安装:如 PHP 8.1,运行
apk add php81-swoole(官方维护,已预编译并启用 zlib) - 若必须源码编译,先装全依赖:
apk add php81-dev zlib-dev openssl-dev pcre2-dev g++ make autoconf - 构建后检查日志末尾是否有
Installing '/usr/lib/php/<version>/swoole.so'</version>;没有这行,代表没真正安装进去 - 进容器运行
ldd $(php-config --extension-dir)/swoole.so | grep zlib,应看到libz.so被正常链接
为什么有些 Swoole 版本根本不检查 zlib
从 Swoole 4.8.0 开始,zlib 支持从“可选编译”变成“强制启用”,只要系统有 zlib.h 就自动开启;但 4.7.x 及更早版本默认关闭,且 configure 不报错,只默默跳过 —— 所以你在 4.7.9 上看到 zlib => disabled 是正常行为,不是你装错了。
判断依据:
- 运行
php -r "echo SWOOLE_VERSION;"确认版本 - 查官方 Changelog:4.8.0 Release Note 明确写了 “Enable zlib compression by default”
- 若项目强依赖 zlib(比如要处理大量压缩响应),别卡在 4.7.x,直接升到 4.8.0+ 或 4.11.x(PHP 8.1 兼容性更稳)
php --ri swoole 的输出和 ldd 的链接结果上——这两处都对,才算真正连上了。

















