直接编译PHP 8.0在飞腾/麒麟ARM64平台失败,90%因configure默认启用x86汇编、SSE探测或未对齐浮点优化;须禁用--disable-opcache-file、--without-gdbm等x86相关选项,并设OPENSSL_NO_ASM=1、CFLAGS="-mgeneral-regs-only -mstrict-align -O2"。

直接编译 PHP 8.0 在飞腾(ARM64)或麒麟 OS 上失败,90% 是因为 ./configure 默认启用了 x86 汇编、SSE 指令探测或未对齐的浮点优化——这些在 ARM 平台上根本不存在,GCC 会直接报 undefined reference to __x86_64__ 或 error: invalid instruction。
configure 阶段必须禁用的 x86 相关选项
PHP 的构建系统会在 configure 时自动检测 __x86_64__ 宏并启用 SSE/AVX 路径(比如 ext/openssl 和 ext/opcache 中的汇编加速模块),这在飞腾 D2000、FT-2000+ 或任何 ARM64 国产平台都会中断编译。
- 务必添加
--disable-opcache-file:避免 opcache 尝试加载 x86 专用的文件缓存汇编桩 - 显式禁用含内联汇编的扩展:
--without-gdbm --without-db4 --without-mcrypt - 绕过 OpenSSL 的 asm 依赖:
export OPENSSL_NO_ASM=1,并在 configure 前确保 OpenSSL 已用./Configure linux-generic64 no-asm编译安装 - 不要加
--enable-inline-optimization:国产版 GCC(如 gcc-aarch64-linux-gnu 11.3+)对此支持不稳,易触发segmentation faultduring make
ARM64 专用的 configure 参数组合
飞腾芯片(FT-2000+/64、D2000)属于标准 ARMv8.1-A,但默认 ./configure 不会启用其支持的 crypto 和 simd 指令集,导致 openssl、hash、mbstring 性能打折。
- 强制启用 ARM 加速能力:
--with-openssl=/usr --with-curl=/usr(确保系统 openssl 是 aarch64 编译且启用了crypto和simd) - gd 库需指定 ARM 友好路径:
--with-jpeg-dir=/usr --with-png-dir=/usr --with-freetype-dir=/usr,避免链接 x86-only 的 libjpeg.so.62 - 关闭非必要浮点依赖:
--without-pear --disable-phar --disable-posix(减少对 glibc 浮点 ABI 的隐式依赖) - 明确声明目标架构:
--build=x86_64-pc-linux-gnu --host=aarch64-linux-gnu,防止 configure 错判本地环境
编译与安装阶段的关键补丁
即使 configure 成功,make 过程中仍可能因指令集不匹配或内存对齐问题崩溃,尤其在 ext/standard/string.c 或 Zend/zend_string.c 中调用 memchr / memcmp 时。
立即学习“PHP免费学习笔记(深入)”;
- 编译前设置:
export CFLAGS="-mgeneral-regs-only -mstrict-align -O2",禁用浮点寄存器作通用寄存器,强制地址对齐检查 - 若使用 GCC 12+,追加:
-mcpu=ft2000plus(飞腾 FT-2000+/64)或-mcpu=generic+crypto+simd(兼容多代飞腾) - 遇到
undefined reference to 'OPENSSL_ia32cap_P':说明 PHP 链接了 x86 版 openssl,删掉/usr/lib64/libssl.so符号链接,改用/usr/lib/aarch64-linux-gnu/libssl.so -
make install后验证:/usr/local/php/bin/php -v输出应含built: Apr 2026和Configure Command => './configure' ... --host=aarch64-linux-gnu
JIT 与 Opcache 在飞腾平台的实际表现
PHP 8.0 的 opcache.jit 在 ARM64 上可用,但飞腾当前微架构(FT-2000+/64)不支持 SVE,且 JIT 编译器生成的代码对 cache line 对齐更敏感,盲目开启反而降低吞吐。
- 仅在高并发计算密集型服务中启用:
opcache.jit_buffer_size=256M+opcache.jit=1255 - 必须同步关闭
opcache.validate_timestamps=0,否则 JIT 缓存频繁失效 - 首次启动后检查
php -i | grep jit,确认输出为jit enabled;若为disabled (unsupported CPU),说明内核未启用lpae或 GCC 缺失-mgeneral-regs-only - 注意:麒麟 V10 SP1 默认内核已启用
lpae和crypto,但 SP0 需手动升级内核至 ≥ 4.19.90-22.5.ky10.aarch64
最易被忽略的是 OpenSSL 的 ABI 兼容性——哪怕 configure 和 make 都通过,只要系统里混装了 x86_64 和 aarch64 的 openssl 开发包,PHP 就会在运行时因符号解析失败而 core dump。部署前务必用 readelf -d /usr/local/php/bin/php | grep NEEDED 确认所有依赖都是 aarch64 架构。



















