不需要额外打补丁,但必须用对应架构的编译器和运行时环境重新编译PHP;卡点在于glibc版本、CPU指令集兼容性及第三方库适配,如LoongArch需loongarch64工具链、ARM64需确认crypto扩展支持。
PHP 编译时是否需要为龙芯、飞腾等国产 CPU 单独打补丁?
不需要额外打补丁,但必须用对应架构的编译器和运行时环境重新编译 PHP。龙芯(LoongArch)、飞腾(ARM64,如 FT-2000/4、D2000)本身不拒绝标准 PHP 源码,真正卡住的是底层依赖:glibc 版本、CPU 指令集(如 LoongArch 不支持 x86 的
,ARM64 没有
)、以及扩展所依赖的第三方库(如
、
)是否已适配。
龙芯 3A5000/3C5000 运行的是 LoongArch64,需使用
工具链,且内核 ≥ 5.19(原生 LoongArch 支持合入主线时间)
飞腾 D2000/FT-2000+ 属于 ARM64,可复用主流 aarch64 构建流程,但需确认系统镜像是否启用
和
扩展(影响
性能)
所有国产平台目前均不预装 PHP,必须源码编译或使用厂商提供的仓库(如统信 UOS 的
包、麒麟软件的
)
configure 阶段哪些参数容易导致国产平台编译失败?
最常踩坑的是硬编码 x86 汇编、未关闭非通用指令优化、以及忽略交叉编译路径。PHP
默认会探测
宏并启用 SSE 相关代码路径,这在 LoongArch 或无 SIMD 的飞腾早期芯片上直接报错。
必须显式指定
和
,例如龙芯交叉编译:
禁用非目标平台汇编:
(这些扩展含 x86 内联汇编)
OpenSSL 若为自建,需先用
编译,否则 PHP 链接时找不到
避免
:国产 GCC 对此支持不稳定,易触发段错误
常见扩展在国产平台的兼容状态
不是所有 PECL 扩展都能“一键启用”。部分扩展依赖硬件特性或闭源驱动,需人工裁剪或替换实现。
:LoongArch 下需补丁(PHP 8.2+ 已合入基本支持),飞腾 ARM64 可直接启用,但建议加
(国产内核 hugetlbpage 支持不一)
、
:纯 C 实现,只要对应客户端库(
、
)已适配,即可编译通过
:需用
3.21+ 且禁用
后端(其默认生成 x86 汇编)
:依赖 ImageMagick,而后者在龙芯上需手动关闭
和
(libde265 未适配 LoongArch)
运行时遇到 “Illegal instruction” 怎么快速定位?
这不是 PHP 自身问题,而是某层动态库执行了当前 CPU 不支持的指令。典型场景是用了 x86 编译的
或混入了 Intel QAT 加速模块。
PHP 8.5.5
PHP 8.5.5 是 PHP 8.5 分支的维护更新版本。该版本延续了“小步快跑”的迭代逻辑,通过深度错误修复、底层性能微调以及安全加固,旨在为开发者提供一个更健壮、更高效的运行环境。该版本严格遵守语义化版本规范,不包含破坏性变更。
下载
立即学习
“
PHP免费学习笔记(深入)
”;
先用
确认架构(LoongArch64 / aarch64)
再用
和
核对 ABI 类型
最直接方式:
,看失败前加载了哪个 .so
若报错来自
,临时注释
中所有
行,逐个开启排查
国产平台的 PHP 适配,本质是构建链路的可控性问题——你得清楚每个
是谁编的、用什么指令集生成的、有没有偷偷调用
或
。别信“下载二进制包就能跑”,也别指望 PHP configure 能自动绕过所有硬件差异。
movqrdtscopenssllibxml2gcc-loongarch64-linux-gnulpaecryptoopensslphp8.2-cliphp7.4-fpm./configure__x86_64__--build--host--build=x86_64-pc-linux-gnu --host=loongarch64-unknown-linux-gnu--disable-opcache-file --without-gdbm --without-db4./Configure linux-generic64 no-asmOPENSSL_ia32cap_P--enable-inline-optimizationopcacheopcache.huge_code_pages=0redispdo_mysqlhiredislibmysqlclientgrpcprotobufnanopbimagickopenmpheiclibsqlite3.socat /proc/cpuinfo | grep -E "model|isa"file $(which php)readelf -A $(php-config --extension-dir)/opcache.so | grep Tag_ABIstrace -e trace=execve php -v 2>&1 | grep -E "(execve|failed)"zend_extensionphp.inizend_extension=.socpuidrdrand