一套能直接执行的内网离线编译私有 PHP 内核完整流程全大白话、偏生产可落地。 先一句结论forshortcuts 最佳方式“联网机一次性打全源码和依赖包” “内网机可重复构建脚本” “产物校验和版本固化”。 to interrupt 不要在内网临时手搓不然每次升级都痛苦。 ---1)目标先定死避免后面反复改 你先固定4件事1. PHP 版本比如8.3.72. 构建目标CLI/FPM要不要 opcache、curl、openssl、pdo_mysql3. CPU 架构x86_64 / aarch644. 安装路径比如 /opt/private-php/8.3.7 ---2)整体流程图大白话1. 联网机器下载所有东西PHP 源码、三方库源码、工具链包2. 打成一个离线包tar 清单sha2563. 把离线包拷到内网构建机4. 内网机解包按脚本编译5. 生成私有 PHP 二进制 扩展 配置模板6. 跑验收脚本功能、模块、安全配置7. 打成发布包给业务机部署 ---3)目录规范建议直接照抄 /offline-build/ sources/# 源码包rpms/# 系统依赖包(如果是rpm体系)debs/# 系统依赖包(如果是deb体系)scripts/# 构建脚本output/# 编译产物logs/# 日志manifest/# sha256清单、版本说明---4)联网机准备拉齐所有材料 A. 下载 PHP 和常用依赖源码 常见至少准备 - php-src - openssl -curl- zlib - libxml2 - onigurumambstring 常用 - sqlite如用 - icu如开 intl B. 下载系统构建依赖 按系统准备离线包 - GCC、make、autoconf、bison、re2c、pkg-config - libc 头文件、openssl-devel、curl-devel、zlib-devel 等 C. 生成完整校验清单 sha256sum sources/*manifest/SHA256SUMS ---5)内网机安装依赖离线 - RPM 系rpm-Uvh*.rpm按依赖顺序 - DEB 系dpkg-i*.deb不齐就补齐 核心是让这些命令可用 gcc--versionmake--versionautoconf--versionphpize--version# 编完php后再有---6)内网编译脚本完整模板 下面这个脚本是“私有 PHPFPMCLI”常用模板。 文件scripts/build_private_php.sh#!/usr/bin/env bashset-euopipefailPHP_VER8.3.7PREFIX/opt/private-php/${PHP_VER}WORKDIR/offline-buildSRCDIR${WORKDIR}/sourcesLOGDIR${WORKDIR}/logsOUTDIR${WORKDIR}/outputmkdir-p${LOGDIR}${OUTDIR}echo[1/6] verify source checksums...cd${WORKDIR}sha256sum-cmanifest/SHA256SUMS|tee${LOGDIR}/sha256_check.logecho[2/6] extract php source...cd${SRCDIR}tar-xfphp-${PHP_VER}.tar.gzcdphp-${PHP_VER}echo[3/6] configure...# 你可以按业务继续增减模块./buildconf--force${LOGDIR}/buildconf.log21CFLAGS-O2 -fstack-protector-strong -D_FORTIFY_SOURCE2 -fPICLDFLAGS-Wl,-z,relro -Wl,-z,nowexportCFLAGS LDFLAGS ./configure\--prefix${PREFIX}\--enable-fpm\--with-fpm-userwww-data\--with-fpm-groupwww-data\--enable-cli\--disable-cgi\--enable-opcache\--enable-mbstring\--enable-intl\--enable-bcmath\--enable-sockets\--with-openssl\--with-zlib\--with-curl\--with-mysqli\--with-pdo-mysql\--with-config-file-path${PREFIX}/etc\--with-config-file-scan-dir${PREFIX}/etc/conf.d\--without-pear\${LOGDIR}/configure.log21echo[4/6] build...make-j$(nproc)${LOGDIR}/make.log21echo[5/6] install...makeinstall${LOGDIR}/install.log21echo[6/6] package...mkdir-p${PREFIX}/etc/conf.dcpphp.ini-production${PREFIX}/etc/php.initar-C/-czf${OUTDIR}/private-php-${PHP_VER}.tar.gzopt/private-php/${PHP_VER}echoBuild done:${OUTDIR}/private-php-${PHP_VER}.tar.gz${PREFIX}/bin/php-v${PREFIX}/bin/php-m---7)最小安全配置模板php.ini 文件/opt/private-php/8.3.7/etc/php.ini 里重点项 expose_phpOff display_errorsOff log_errorsOn date.timezoneAsia/Shanghai allow_url_fopenOff allow_url_includeOff disable_functionsexec,passthru,shell_exec,system,proc_open,popen ---8)验收脚本完整模板 文件scripts/verify_private_php.sh#!/usr/bin/env bashset-euopipefailPHP_BIN${1:-/opt/private-php/8.3.7/bin/php}echo version ${PHP_BIN}-v|head-n3echo required modules required(opensslcurlmbstring intl mysqli pdo_mysql zlib opcache)forextin${required[]};doif${PHP_BIN}-m|grep-qi^${ext}$;thenecho[OK]${ext}elseecho[FAIL] missing${ext}exit1fidoneecho basic runtime test ${PHP_BIN}-recho PHP_OK\n;${PHP_BIN}-recho json_encode([timetime(),oktrue], JSON_UNESCAPED_UNICODE).PHP_EOL;echoAll checks passed.---9)发布到业务机离线1. 分发 private-php-8.3.7.tar.gz2. 解压到 /会落到 /opt/private-php/8.3.73. 改服务脚本指向新 php/fpm4. 先灰度一台再全量 ---10)最佳实践长期维护关键1. 版本固化源码、编译器、依赖库都记录版本2. 脚本化禁止人工临时命令3. 可重复同输入必须同产出至少功能一致4. 双包策略标准版 裁剪版并存便于回滚5. 升级路径每次只升一个大件先 PHP再依赖库 --- 一句话收尾 内网离线私有 PHP 内核的最优解不是“编出来就行”而是“可重复构建 可验证 可回滚”的工程化流水线。