“能落地”的版本:PHP 内核在国产 CPU(鲲鹏/海光/飞腾)上的编译与指令集适配最佳方式,全大白话。 先一句结论:forshortcuts 最佳方式不是手写一堆 CPU 私有指令,而是“按架构分包构建 + 保守基线指令 + 可选优化开关 + 自动验收基准”。 esc to interrupt 这样最稳、最好维护、升级 PHP 成本最低。 ---1)先把 CPU 架构说清楚(很关键) - 鲲鹏:ARM64(aarch64) - 飞腾:大多也是 ARM64(aarch64) - 海光:x86_64(兼容 AMD64 指令体系) 所以你实际上要做的是两条构建线:1. aarch64 线(鲲鹏/飞腾共用主策略)2. x86_64 线(海光策略) ---2)大白话讲“指令集适配”到底在做啥 你调的不是 PHP 语法,而是编译器参数: - -march:允许用到哪一代 CPU 指令 - -mtune:为哪类 CPU 调度优化 - -O2/-O3:优化级别 - LTO/PGO:链接期和剖析引导优化(可选) 核心平衡: - 太激进(只给某一款 CPU)=性能可能高一点,但兼容差 - 太保守(generic)=到处能跑,但吃不到硬件红利 ---3)最佳实践(生产推荐) A. 产物分层(最推荐) 做两类包:1. 通用包(能在同架构多数机器跑)2. 优化包(针对机房主力型号) 例如: - php-8.3-aarch64-generic - php-8.3-aarch64-kunpeng920 - php-8.3-x86_64-generic - php-8.3-x86_64-hygon 这样既稳又能压榨性能。 B. 参数策略 - 默认用 -O2(稳定优先) --O3只在压测收益明确时用 --march=native 只用于“该机专用包”,不要用于通用发布包 C. 不魔改 php-src 优先用 CFLAGS/CXXFLAGS/LDFLAGS + configure 控制。 除非遇到特定平台 bug,才打最小 patch。 ---4)完整构建脚本(可直接改) 下面是一个“按架构自动选参数”的脚本模板。 文件:build_php_domestic_cpu.sh#!/usr/bin/env bashset-euopipefail# 用法:# ./build_php_domestic_cpu.sh /path/to/php-src /opt/php-custom [generic|tuned]## 说明:# - generic: 通用兼容包# - tuned : 当前机器优化包(可能不兼容其他同架构机器)PHP_SRC="${1:-}"PREFIX="${2:-/opt/php-custom}"PROFILE="${3:-generic}"if[[-z"${PHP_SRC}"||!-d"${PHP_SRC}"]];thenecho"Usage:$0/path/to/php-src /install/prefix [generic|tuned]"exit1fiARCH="$(uname-m)"echo"Detected ARCH=${ARCH}, PROFILE=${PROFILE}"BASE_CFLAGS="-fstack-protector-strong -fPIC -D_FORTIFY_SOURCE=2"BASE_LDFLAGS="-Wl,-z,relro -Wl,-z,now"if[["${ARCH}"=="aarch64"]];thenif[["${PROFILE}"=="generic"]];then# 鲲鹏/飞腾通用CPU_FLAGS="-O2 -march=armv8-a -mtune=generic"else# 机器专用优化(示例)# 可根据实际CPU改为更具体目标,如 armv8.2-a 等CPU_FLAGS="-O2 -march=native -mtune=native"fielif[["${ARCH}"=="x86_64"]];thenif[["${PROFILE}"=="generic"]];then# 海光通用CPU_FLAGS="-O2 -march=x86-64 -mtune=generic"else# 机器专用优化CPU_FLAGS="-O2 -march=native -mtune=native"fielseecho"Unsupported ARCH=${ARCH}"exit2fiexportCFLAGS="${CPU_FLAGS}${BASE_CFLAGS}"exportCXXFLAGS="${CFLAGS}"exportLDFLAGS="${BASE_LDFLAGS}"echo"CFLAGS=${CFLAGS}"echo"LDFLAGS=${LDFLAGS}"cd"${PHP_SRC}"./buildconf--force./configure\--prefix="${PREFIX}"\--enable-fpm\--with-fpm-user=www-data\--with-fpm-group=www-data\--disable-cgi\--enable-opcache\--enable-mbstring\--enable-intl\--with-zlib\--with-openssl\--with-curl\--with-pdo-mysql\--with-mysqli\--enable-sockets\--without-pearmake-j"$(nproc)"makeinstallecho"Build done:${PREFIX}/bin/php""${PREFIX}/bin/php"-v---5)完整验收脚本(功能+指令+性能) 文件:verify_php_build.sh#!/usr/bin/env bashset-euopipefailPHP_BIN="${1:-/opt/php-custom/bin/php}"if[[!-x"${PHP_BIN}"]];thenecho"php binary not found:${PHP_BIN}"exit1fiecho"== Basic Info ==""${PHP_BIN}"-v|head-n2"${PHP_BIN}"-i|grep-E"Architecture|Configure Command|Compiler"||trueechoecho"== Required Extensions =="required=(opensslcurlmbstring intl pdo_mysql mysqli zlib opcache)forextin"${required[@]}";doif"${PHP_BIN}"-m|grep-qi"^${ext}$";thenecho"[OK]${ext}"elseecho"[FAIL] missing${ext}"exit2fidoneechoecho"== Quick Micro Benchmark ==""${PHP_BIN}"-r' $start=microtime(true); $s=0; for($i=0;$i<2000000;$i++){ $s += $i; } echo "sum=".$s.", cost_ms=".(int)((microtime(true)-$start)*1000).PHP_EOL; 'echoecho"All checks passed."---6)PGO/LTO 进阶(有性能追求再上) 顺序是:1. 先用 -fprofile-generate 编译2. 跑真实业务流量回放/压测用例采集 profile3. 再用 -fprofile-use 重编译4. 对比 P95/P99 和吞吐,再决定是否采用 这套对 CPU 密集路径(JSON、正则、字符串处理)有时收益明显。 ---7)常见坑(提前避) - 用-march=native 做“通用包”发布,结果换机就崩 - 盲目-O3导致稳定性/调试性变差 - 只看 QPS,不看 P99 延迟和错误率 - 编译机和运行机架构不一致(尤其容器多平台场景) - 忽略 OpenSSL/libcurl 这些依赖库本身的架构优化 --- 一句话收尾: 国产 CPU 适配的最优解是“按 aarch64/x86_64 分线构建,先 generic 保兼容,再 tuned 榨性能,配套自动验收与基准对比”,而不是硬改 PHP 内核指令路径。