拓展编译卡在make阶段通常是并行构建阻塞或依赖缺失,应改用make -j1单线程编译,并确保phpize、php-config、php.ini和php -v指向同一PHP版本。

拓展编译卡在 make 阶段不动,大概率是并行构建阻塞或依赖缺失
不是死机,而是 make 默认启用多线程(如 -j4),遇到某些 PHP 拓展(比如 redis、swoole 或自定义源码)在链接或生成中间文件时因资源竞争/顺序依赖卡住。常见现象是光标静止、CPU 占用低、无报错输出。
- 先按
Ctrl+Z暂停当前进程,再执行kill %1彻底终止 - 改用单线程编译:
make -j1(注意是数字 1,不是小写 L) - 确保已安装基础构建工具:
gcc、make、autoconf、automake、libtool(Ubuntu/Debian 上用apt install build-essential autoconf automake libtool) - 检查
phpize输出是否正常——如果连phpize都报错(如Cannot find config.m4),说明拓展源码不完整或目录结构不对
phpize 找不到或报错 Cannot find php-config
phpize 是生成 configure 脚本的关键工具,它依赖同版本的 php-config。如果你装了多个 PHP 版本(如系统自带 PHP + 自编译 PHP + phpbrew),phpize 往往指向错误的 php-config。
- 运行
which phpize和phpize --version确认它属于目标 PHP 版本 - 手动指定配置路径:
phpize --with-php-config=/path/to/your/php/bin/php-config(例如/usr/local/php/bin/php-config) - 若提示
php-config不存在,说明 PHP 编译时没启用--enable-embed或没安装php-dev包(Ubuntu/Debian:安装php-dev;CentOS/RHEL:安装php-devel)
configure 成功但 make 报错找不到头文件(如 php.h、zend.h)
这说明 phpize 生成的 configure 脚本没能正确识别 PHP 源码或头文件位置,尤其常见于从包管理器安装的 PHP(头文件被分到 php-dev 包里,但未被自动发现)。
- 确认
php-dev(或php-devel)已安装且版本与当前 PHP 严格一致(php -v和apt list --installed | grep php-dev对比) - 手动补全 include 路径:在
./configure后加--with-php-config=/path/to/php-config,或导出环境变量:export PHP_CONFIG=/path/to/php-config - 极少数情况需软链头文件,例如:
ln -sf /usr/include/php/20220829 /usr/include/php/main(路径以php-config --include-dir输出为准)
make 完成但 make install 后 php -m 不显示拓展
安装成功 ≠ 启用成功。make install 只是把 .so 文件复制到 extension_dir,但 PHP 还需要显式加载它。
立即学习“PHP免费学习笔记(深入)”;
- 查清扩展存放路径:
php-config --extension-dir,确认.so文件确实在该目录下(如redis.so) - 编辑
php.ini(用php --ini查找加载路径),添加一行:extension=redis.so(注意不是extension=redis,除非启用了extension_dir自动补全) - 若用的是 ZTS(线程安全)PHP,而拓展未编译为 ZTS 版本,会静默失败——此时需重新
phpize并确保php-config --zts返回enabled,再./configure --enable-redis --with-php-config=...
phpize、php-config、php.ini、php -v 四者指向的不是同一套东西。卡住时,先逐个验证它们的路径和版本一致性,比盲目重装快得多。











