找回密码
 立即注册
搜索

[搭web环境] PHP 7.4 在 AlmaLinux 10.1 系统上编译时,与系统中高版本的 libxml2 库存在兼容性问题

[复制链接]
智慧谋略 发表于 2026-3-10 15:55:10 | 显示全部楼层 |阅读模式
PHP 7.4 在 AlmaLinux 10.1 系统上编译时,与系统中高版本的 libxml2 库存在兼容性问题,具体表现为函数参数类型不匹配和废弃函数调用。下面我会给你提供完整的解决方案。
问题分析
  • 核心错误:xmlSetStructuredErrorFunc 函数期望接收 const struct _xmlError * 类型的参数,但 PHP 7.4 源码中传递的是非 const 类型,导致类型不兼容。
  • 环境原因:AlmaLinux 10.1 自带的 libxml2 版本较高(新增了 const 修饰),而 PHP 7.4 是较老的版本,源码未适配该变化。
  • 次要警告:xmlRelaxNGCleanupTypes 函数已被废弃,也需要适配。



从 libxml2 2.9.x 系列(包括 2.9.12)开始,xmlSetStructuredErrorFunc 等函数的参数已新增 const 修饰(如 const struct _xmlError *),而 PHP 7.4 源码中对应的函数参数未添加 const,导致类型不兼容 —— 这正是你之前编译失败的核心原因。2.9.12 作为 2.9.x 系列的后续版本,延续了该接口设计,并未回滚或兼容旧版 PHP 的写法。
无额外收益:libxml2 2.9.12 的更新主要集中在安全补丁和细节优化,并未针对旧版 PHP 做兼容性适配,升级后无法解决编译问题,反而可能因版本差异引入新的依赖冲突。

如果你在Linux上鼓捣过一些需要处理XML数据的程序,比如写个爬虫解析网页、或者搞点数据交换,十有八九会遇到这个让人头疼的错误:“libxml2 not found”。我第一次碰到这问题的时候,也是一头雾水,明明系统里好像有相关的东西,为什么编译就是通不过呢?

简单来说,libxml2是一个用C语言写的、功能非常强大的XML解析库。它就像是一个超级专业的XML翻译官,能把一堆乱七八糟的XML标签和内容,转换成你的程序能轻松理解和操作的数据结构。很多软件,包括一些著名的开源项目,底层都在用它。但问题在于,Linux世界太大了,有Ubuntu、Debian、CentOS、Fedora等等各种发行版,每个发行版管理软件的方式和默认安装的库都有点不一样。你的开发环境可能需要一个特定版本的libxml2,或者需要开发 头文件 (就是那些.h文件),而系统自带的可能只是个运行时库,这就导致了“找不着”的尴尬。

所以,搞定libxml2的安装和配置,就成了在Linux上进行XML相关开发的“第一课”。这篇文章,我就结合自己这些年踩过的坑,给你掰开揉碎了讲清楚两种最主流的方法:用系统自带的包管理器(最省事)和从源码自己编译(最灵活)。目标就一个:让你彻底告别“libxml2 not found”,轻松上路。

RHEL/CentOS/Fedora系列系统

如果你用的是Red Hat系的Linux,比如CentOS、Fedora或者RHEL,那么包管理器通常是yum(CentOS 7/RHEL 7)或dnf(CentOS 8/RHEL 8/Fedora)。操作逻辑和Debian系是一样的。


对于使用dnf的新系统(如CentOS 8、Fedora):
  1. sudo dnf install libxml2-devel
复制代码
同样,注意包名是libxml2-devel(Red Hat系喜欢用-devel而不是-dev)。安装后,同样可以用pkg-config --modversion libxml-2.0来验证。

包管理器安装的优点和局限: 优点太明显了:一键搞定,自动处理依赖,系统统一管理,后续更新也方便。但它有个局限:你安装的版本是发行版软件仓库决定的。比如Ubuntu 20.04自带的可能是libxml2 2.9.10,而你的项目可能严格要求要用2.9.12以上的版本才能用某个新特性。这时候,包管理器就无能为力了,你就得考虑第二种方法——源码编译。




 楼主| 智慧谋略 发表于 2026-3-10 16:14:19 | 显示全部楼层
要在 AlmaLinux 10 上安装 PHP 7.4,请按照以下步骤启用 Remi 仓库,安装 PHP 核心包,并添加常用扩展。
步骤1:先更新所有系统包:
sudo dnf update -y

步骤2:安装Remi仓库包:
sudo dnf install https://rpms.remirepo.net/enterprise/remi-release-10.rpm -y

步骤3:列出可用的PHP模块流:
sudo dnf module list php

步骤4:重置默认PHP模块并启用PHP 7.4:
sudo dnf module reset php -ysudo dnf module enable php:remi-7.4 -y

步骤5:安装PHP 7.4核心组件:
sudo dnf install -y php74 php74-php-fpm php74-php-cli

步骤6:安装常用的PHP扩展:
sudo dnf install -y php74-php-{mysqlnd,curl,gd,mcrypt,json,pear,common,xml,zip,devel,xsl,soap,bcmath,mbstring,gettext,imagick}

  • mysqlnd – PHP原生MySQL驱动程序
  • curl – 启用 HTTP 和 API 请求
  • GD——图像处理与处理
  • mcrypt – 加密功能(遗留支持)
  • json – JSON data handling
  • pear – PHP 扩展与应用仓库
  • common – 核心PHP文件和依赖
  • xml——XML 解析与处理
  • zip – ZIP 归档管理
  • Devel – PHP 开发头部
  • xsl – XSLT 变换
  • soap – SOAP 协议支持
  • bcmath – 任意精确数学
  • mbstring – 多字节字符串处理
  • gettext – 本地化与翻译
  • imagick – 使用ImageMagick的高级图像处理
步骤7:检查已安装的PHP版本:
php74 -v

恭喜你!您已成功在 AlmaLinux 10 上安装了 PHP 7.4 及必要的扩展,您的系统现在已准备好进行 PHP 应用开发或托管。



 楼主| 智慧谋略 发表于 2026-3-10 16:50:35 | 显示全部楼层
换成 Rocky Linux 8.1 后,宝塔面板可以非常顺畅地安装 PHP 7.4,这是目前解决 PHP 7.4 兼容问题的最优系统选择——Rocky 8.1 自带的 libxml2 版本为 2.9.7,刚好适配 PHP 7.4 的编译要求,无需修改源码、无需降级 / 编译额外的 libxml2,直接通过宝塔一键安装即可成功。

宝塔安装 MySQL 8.4+PHP 8.5:AlmaLinux/Rocky Linux 最佳版本选择核心结论:优先选 AlmaLinux 9.6 或 Rocky Linux 9.6(x86_64 架构),绝对不要用 Rocky/Alma 10.x
不要用 10.x 版本:GCC 14 与宝塔编译脚本冲突,会出现 libmcrypt、pcre 等依赖库编译失败

Rocky 10.x/Alma 10.x 中文面板推荐(MySQL 8.4+PHP 8.5)核心结论:优先选 1Panel(开源轻量)或 小皮面板(安装了只有php8.0和mysql8),两者均原生支持 Rocky 10/Alma 10,可完美安装 MySQL 8.4+PHP 8.5,无需编译老旧依赖库

为什么这些面板能兼容 Rocky 10/Alma 10?
  • 容器化部署:1Panel 和小皮面板均支持 Docker 安装,将 MySQL 和 PHP 运行在独立容器中,完全隔离系统环境,避开 GCC 14 与老旧依赖的冲突
  • 适配新系统:这些面板的开发团队已针对 Rocky 10/Alma 10 进行了兼容性测试,提供了适配新系统的安装包和脚本
  • 使用官方 RPM 包:MySQL 8.4 和 PHP 8.5 在 Rocky 10/Alma 10 的官方仓库中已有原生支持,面板直接调用官方包安装,无需手动编译

高级模式
B Color Image Link Quote Code Smilies

本版积分规则

Archiver|手机版|小黑屋|探索掌握未知、共创美好未来

GMT+8, 2026-9-18 05:00 , Processed in 0.046289 second(s), 35 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表