PHP 7.0+ 原生支持 ARMv7 和 ARM64,交叉编译需指定 --host 和工具链,禁用 x86 特性扩展,JIT 仅限 aarch64 且增益有限,注意 OpenSSL 路径、时钟精度及 ABI 兼容性。

PHP 源码本身支持 ARM 架构,从 PHP 7.0 开始官方就已移除对非 ARM 支持的条件编译分支,现代 PHP(7.4+ / 8.x)在 ARM64(aarch64)和 ARMv7 上均可正常编译运行,无需打补丁或魔改源码。
编译 PHP 时需显式指定 --host 和工具链(交叉编译场景)
在 x86_64 主机上为 ARM 设备(如树莓派、AWS Graviton 实例)交叉编译 PHP 时,configure 脚本不会自动识别目标平台,必须人工干预:
- 使用
--host=arm-linux-gnueabihf(ARMv7)或--host=aarch64-linux-gnu(ARM64),否则 configure 可能误判为 build host 架构,导致生成错误的汇编/内置函数 - 必须设置
CC、AR、RANLIB等变量指向交叉工具链,例如:CC=arm-linux-gnueabihf-gcc - 禁用依赖于 x86 特性(如 AVX、RDRAND)的扩展,比如某些自定义加密扩展或未适配的
libsodium版本 -
./configure后务必检查输出中的host行是否匹配预期,例如:checking build system type... x86_64-pc-linux-gnu(build)和checking host system type... aarch64-unknown-linux-gnu(host)
./configure 阶段常见 ARM 相关报错及绕过方式
以下错误多因 autoconf 检测逻辑未覆盖 ARM 边界情况,而非 PHP 本身不兼容:
-
configure: error: Cannot find OpenSSL's <evp.h>:ARM 系统 OpenSSL 头文件路径常为/usr/include/openssl,但某些发行版(如 Debian arm64)把头文件放在/usr/include/aarch64-linux-gnu/openssl,需加--with-openssl=/usr或--with-openssl-includes=/usr/include/aarch64-linux-gnu -
configure: WARNING: unrecognized options: --enable-opcache-file:该选项在 PHP 8.2+ 已废弃,ARM 平台无特殊影响,直接删掉即可 - 检测
getrandom()失败:ARM Linux 内核较旧(如 3.10)可能未实现该 syscall,configure 会 fallback 到/dev/urandom,不影响功能,但若强制要求可加--without-system-random
运行时需注意扩展 ABI 兼容性与 JIT 限制
PHP 8.0+ 的 OPcache JIT 在 ARM 上默认禁用,且目前仅支持 aarch64(不支持 ARMv7),启用需满足严格条件:
立即学习“PHP免费学习笔记(深入)”;
- JIT 编译器(Zend VM)依赖
mmap(MAP_JIT),仅 macOS 和部分新版 Linux(5.10+)支持;多数 ARM Linux 发行版内核未开启CONFIG_ARM64_BTI_KERNEL或缺少用户空间 JIT 支持 - 即使成功启用 JIT(
opcache.jit=1255),ARM 上性能增益远低于 x86_64,实测通常仅提升 5–15%,而内存开销增加明显 - 第三方扩展(如
igbinary、redis)若含内联汇编或 x86-only SIMD 优化(如simdjson扩展),在 ARM 下需确认是否已发布 aarch64 构建版本,否则php -m会报undefined symbol - ARMv7 设备(如树莓派 2/3)需确保使用
float-abi=hard编译的 PHP,否则调用某些数学函数(sin、exp)可能返回 NaN
最易被忽略的是时钟源精度——ARM SoC(尤其嵌入式板卡)常使用低频 RTC 或未校准的 TSC-like 计数器,microtime(true) 和 hrtime() 在高并发下可能出现微秒级跳变,影响基于时间戳的限流、缓存失效等逻辑。建议在生产 ARM 环境中始终启用 systemd-timesyncd 或 ntpd 并验证 adjtimex 输出。



















