一套能直接执行的:内网离线编译私有 PHP 内核完整流程,全大白话、偏生产可落地。 先一句结论:forshortcuts 最佳方式=“联网机一次性打全源码和依赖包” + “内网机可重复构建脚本” + “产物校验和版本固化”。 to interrupt 不要在内网临时手搓,不然每次升级都痛苦。 ---1)目标先定死(避免后面反复改) 你先固定4件事:1. PHP 版本(比如8.3.7)2. 构建目标(CLI/FPM,要不要 opcache、curl、openssl、pdo_mysql)3. CPU 架构(x86_64 / aarch64)4. 安装路径(比如 /opt/private-php/8.3.7) ---2)整体流程图(大白话)1. 联网机器下载所有东西(PHP 源码、三方库源码、工具链包)2. 打成一个离线包(tar)+ 清单(sha256)3. 把离线包拷到内网构建机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 - oniguruma(mbstring 常用) - 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)内网编译脚本(完整模板) 下面这个脚本是“私有 PHP(FPM+CLI)”常用模板。 文件:scripts/build_private_php.sh#!/usr/bin/env bashset-euopipefailPHP_VER="8.3.7"PREFIX="/opt/private-php/${PHP_VER}"WORKDIR="/offline-build"SRCDIR="${WORKDIR}/sources"LOGDIR="${WORKDIR}/logs"OUTDIR="${WORKDIR}/output"mkdir-p"${LOGDIR}""${OUTDIR}"echo"[1/6] verify source checksums..."cd"${WORKDIR}"sha256sum-cmanifest/SHA256SUMS|tee"${LOGDIR}/sha256_check.log"echo"[2/6] extract php source..."cd"${SRCDIR}"tar-xf"php-${PHP_VER}.tar.gz"cd"php-${PHP_VER}"echo"[3/6] configure..."# 你可以按业务继续增减模块./buildconf--force>"${LOGDIR}/buildconf.log"2>&1CFLAGS="-O2 -fstack-protector-strong -D_FORTIFY_SOURCE=2 -fPIC"LDFLAGS="-Wl,-z,relro -Wl,-z,now"exportCFLAGS LDFLAGS ./configure\--prefix="${PREFIX}"\--enable-fpm\--with-fpm-user=www-data\--with-fpm-group=www-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.log"2>&1echo"[4/6] build..."make-j"$(nproc)">"${LOGDIR}/make.log"2>&1echo"[5/6] install..."makeinstall>"${LOGDIR}/install.log"2>&1echo"[6/6] package..."mkdir-p"${PREFIX}/etc/conf.d"cpphp.ini-production"${PREFIX}/etc/php.ini"tar-C/-czf"${OUTDIR}/private-php-${PHP_VER}.tar.gz""opt/private-php/${PHP_VER}"echo"Build 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_php=Off display_errors=Off log_errors=On date.timezone=Asia/Shanghai allow_url_fopen=Off allow_url_include=Off disable_functions=exec,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}"-r'echo "PHP_OK\n";'"${PHP_BIN}"-r'echo json_encode(["time"=>time(),"ok"=>true], JSON_UNESCAPED_UNICODE).PHP_EOL;'echo"All checks passed."---9)发布到业务机(离线)1. 分发 private-php-8.3.7.tar.gz2. 解压到 /(会落到 /opt/private-php/8.3.7)3. 改服务脚本指向新 php/fpm4. 先灰度一台,再全量 ---10)最佳实践(长期维护关键)1. 版本固化:源码、编译器、依赖库都记录版本2. 脚本化:禁止人工临时命令3. 可重复:同输入必须同产出(至少功能一致)4. 双包策略:标准版 + 裁剪版并存,便于回滚5. 升级路径:每次只升一个大件(先 PHP,再依赖库) --- 一句话收尾: 内网离线私有 PHP 内核的最优解,不是“编出来就行”,而是“可重复构建 + 可验证 + 可回滚”的工程化流水线。