
上周帮客户对接微信支付接口,调试时突然报了个错:Call to undefined function dom_import_simplexml()。查了下代码,原来是解析微信返回的XML数据时用到了dom_import_simplexml()函数,而服务器上的PHP根本没装DOM扩展——相信做PHP开发的同学,尤其是接触过微信、支付宝这类依赖XML接口的场景,多少都遇到过这种“函数未定义”的问题。
花了10分钟搞定扩展安装,今天把整个排错、解决过程整理出来,帮你下次遇到类似问题时不用再查半天文档。
首先得明确,dom_import_simplexml()不是PHP自带的“基础函数”,而是属于DOM扩展里的函数——这个扩展主要用来处理XML和HTML文档,微信接口、部分第三方平台的数据交互常用到它。
报错的核心原因只有一个:当前PHP环境没有启用DOM扩展。
至于为什么没启用,常见有两种情况:
--disable-dom参数(禁用了DOM扩展),不过这种情况比较少,默认编译时DOM是开启的;php-xml相关的扩展包(很多Linux系统默认只装PHP核心组件,XML扩展需要手动加)。在解决问题前,先通过两个简单方法确认扩展状态,避免做无用功:
在服务器上新建一个test.php文件,写入以下代码:
<?php
phpinfo();
?>通过浏览器访问这个文件,搜索“dom”关键词——如果看不到“DOM/XML enabled”的配置项,就说明确实没装DOM扩展;如果能看到,那可能是扩展没加载,需要检查php.ini配置。
如果服务器没有Web访问权限,也可以通过SSH登录后,在命令行执行:
php -m | grep dom如果执行后没有输出“dom”相关内容,就证明扩展未安装;有输出则说明已安装,可能是Web服务器没重启导致扩展没生效。
PHP的安装方式主要分两种(编译安装、包管理器安装),对应的DOM扩展安装方法也不一样,这里分别说清楚。
我当时用的是CentOS服务器,PHP是通过yum装的,这种情况最简单,直接装php-xml包就行。
装扩展前必须对应PHP版本,比如PHP5.4要装php54w-xml,PHP7.2要装php72w-xml,避免版本不兼容。
执行命令查版本:
php -v我当时查出来是PHP5.4,所以后续命令要带“54”标识。
执行以下命令,列出当前PHP版本可安装的XML相关包:
yum list | grep php54 # 这里的“54”替换成你的PHP版本,比如73、81会看到一堆扩展包,其中带“xml”的就是我们要的(比如我当时看到的php54w-xml.x86_64)。
直接执行安装命令(把包名换成你搜索到的):
yum install php54w-xml -y“-y”参数是自动确认安装,不用手动输“y”,省时间。
安装完成后,必须重启Apache或Nginx,让PHP加载新扩展:
# 重启Apache
service httpd restart
# 重启Nginx(如果用的是Nginx+PHP-FPM,还要重启PHP-FPM)
service nginx restart
service php-fpm restart # PHP-FPM也要重启,否则扩展不生效如果你的PHP是自己下载源码编译的,那需要重新编译一次,确保没禁用DOM扩展。
比如你当时把源码放在/usr/local/src/php-5.4.45,就进入这个目录:
cd /usr/local/src/php-5.4.45编译PHP时,configure命令决定了哪些扩展启用。如果之前加了--disable-dom,这次要删掉这个参数,确保保留DOM相关配置。
典型的configure命令(根据你的实际需求调整,重点是没有--disable-dom):
./configure --prefix=/usr/local/php \
--with-apxs2=/usr/local/apache/bin/apxs \
--with-mysql \
--enable-mbstring # 其他参数根据你的需求加,关键是不写--disable-dom执行编译和安装命令:
make && make install和yum安装一样,最后重启Apache或Nginx+PHP-FPM:
service httpd restart # Apache用户
# 或
service nginx restart && service php-fpm restart # Nginx用户安装完成后,一定要再验证一次,避免白忙活:
test.php,搜索“dom”,能看到以下配置就说明成功了:
| DOM/XML | enabled |
|---------|---------|
| DOM/XML API Version | 20031129 |
| libxml Version | 2.7.6 |这时候再去调试微信接口,dom_import_simplexml()函数就能正常使用,XML解析也不会再报错了。
php54w-xml,会提示版本冲突,一定要用yum list | grep php74找对应的包;最后总结下:遇到Call to undefined function dom_import_simplexml(),先确认DOM扩展是否安装,再根据PHP的安装方式选择对应的安装方法,装完重启服务就搞定。这个问题看着吓人,其实本质就是缺扩展,不用慌~
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。