编译php前必须装齐libxml2-dev、libssl-dev、libcurl4-openssl-dev、libjpeg-dev、libpng-dev、libfreetype6-dev、libzip-dev、libonig-dev、libsqlite3-dev和re2c,缺一则configure报错。

编译前必须装齐的依赖库,缺一个就卡在 configure
configure 脚本一运行就报 configure: error: xxx not found,八成是依赖没装全。不同系统包名不同,但核心库是一致的:libxml2-dev、libssl-dev、libcurl4-openssl-dev、libjpeg-dev、libpng-dev、libfreetype6-dev、libzip-dev、libonig-dev(PHP 7.3+ 必需)、sqlite3-dev。Ubuntu/Debian 系统用 apt install,CentOS/RHEL 用 yum install 或 dnf install,注意后缀是 -dev 还是 -devel。
特别容易漏的是:libonig-dev(正则引擎,PHP 7.3 起替代 mbregex)、libsqlite3-dev(pdo_sqlite 默认启用)、re2c(词法分析器,configure 阶段需要)。不装 re2c 会直接中断,不是警告。
./configure 参数必须按版本微调,硬套旧参数会失败
PHP 7.4 和 PHP 8.2 的默认行为差异很大:比如 --enable-opcache 在 8.0+ 已默认启用,加了不报错但冗余;而 --with-mysqli 如果不指定 mysqlnd,在新版中可能找不到头文件;--with-gd 在 8.0+ 必须显式加 --with-jpeg 和 --with-freetype,否则编译时提示 gd.h: No such file。
- PHP 7.4 常用组合:
--with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --enable-opcache - PHP 8.1+ 推荐写法:
--with-mysqli --with-pdo-mysql --enable-opcache=shared(显式声明共享模块) - 所有版本都应避免
--enable-debug用于生产环境,它会让php -v输出带debug标记,且性能下降 30%+。
make -j 并行编译要控制核心数,超了反而变慢甚至 OOM
make -j$(nproc) 看起来很高效,但在 32GB 内存以下的机器上,PHP 8.2+ 编译时容易触发 OOM killer 杀掉 cc1 进程。实测安全值是 make -j$(($(nproc) / 2 + 1)) —— 比如 8 核机器用 -j5,既提速又稳定。
编译中途中断不要直接 make install:先 make clean,再重新 make。残留的 .o 文件可能链接失败,错误信息类似 undefined reference to 'php_pcre_replace',其实是 pcre 模块没重编。
多版本共存必须隔离路径和配置,别指望软链接搞定
每个版本必须用独立 --prefix,例如 /usr/local/php74、/usr/local/php82。千万别用 /usr/local/php 然后靠软链接切换 —— php-fpm 启动时会读取自身二进制所在路径下的 etc/php-fpm.conf,软链接会导致配置错乱。
关键隔离点:
-
php.ini必须放在--with-config-file-path指定路径下,不能复用 -
php-fpm.conf中的pid、error_log、listen(建议用端口而非 socket,如127.0.0.1:9074)必须每版唯一 - 环境变量 PATH 添加方式:在
/etc/profile.d/php74.sh里写export PATH="/usr/local/php74/bin:$PATH",而不是全局改/etc/profile
最常被忽略的是 phpize:它会读取当前 php-config 路径来决定扩展编译目标。装多个版本后,运行 phpize 前务必确认 which phpize 指向对应版本,否则扩展编译出来根本加载不了。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











