当前在 CentOS 6.5 上运行 PHP 5.4。
我安装了 webtatic php55w 包,然后顺利安装了 PEAR+PECL,并通过 PECL 安装了 redis 和 mongo。
不久之后,我意识到 5.5 与我正在使用的框架不兼容,因此我使用 yum 删除了 php55w 并在其位置安装了 php54w。
现在 pecl 命令完全不起作用了。每次我发出任何 pecl 命令时,它都会产生一串很长的错误(缩写...大多数重复了几十次):
Warning: Invalid argument supplied for foreach() in Command.php on line 259
Warning: Invalid argument supplied for foreach() in /usr/share/pear/PEAR/Command.php on line 259
...etc etc etc...
Notice: Undefined index: honorsbaseinstall in Role.php on line 180
Notice: Undefined index: honorsbaseinstall in Role.php on line 180
...etc etc etc...
Notice: Undefined index: installable in Role.php on line 145
Notice: Undefined index: installable in Role.php on line 145
...etc etc etc...
Notice: Undefined index: phpfile in Role.php on line 212
Notice: Undefined index: phpfile in Role.php on line 212
...etc etc etc...
Notice: Undefined index: config_vars in Role.php on line 49
Notice: Undefined index: config_vars in Role.php on line 49
...etc etc etc...
Warning: Invalid argument supplied for foreach() in PEAR/Command.php on line 259
Warning: Invalid argument supplied for foreach() in /usr/share/pear/PEAR/Command.php on line 259
...etc etc etc...
XML Extension not found
我怎样才能解决这个问题?
答案1
在 RedHat EL v6 上将 PHP 安装更新到 5.5.14 后,我遇到了此错误。我通过 Yum 包管理器安装了 PHP,然后需要重新安装我使用的某些 PHP 扩展。在搜索如何解决此问题的提示时,我遇到了这个问题,现在我已经找到了一个可行的解决方案,我想在这里分享我的发现。我在网上找到的其他建议包括删除并重新安装 PECL/PEAR,甚至我的 PHP 安装都无法解决这个问题。最后,经过进一步研究和查看 PECL/PEAR 的源代码后,我找到了真正的原因。希望以下内容对其他人有所帮助:
如果您的 PHP 安装默认情况下未启用 XML,则在尝试运行 PECL 时可能会看到此错误,但 XML 支持通常通过 PHP 扩展模块加载到您的 PHP 安装中(如果./configure --disable-xml
在从源代码构建 PHP 时指定了标志,或者如果您通过各种包管理器安装了 PHP,并且该 PHP 版本配置为通过扩展模块加载 XML,则可能会出现这种情况)。
注意 PECL 错误输出的最后一行是怎样的XML Extension not found
——出现此错误的原因是,当 PECL 尝试使用其 XMLParser.php 类时,由于无法访问 XML 扩展而失败(它使用extension_loaded('xml')
XMLParser.php 源代码的第 259 行左右检查 XML 模块),并且由于 XML 模块不可用,它无法解析其配置/设置文件并输出上面看到的所有其他错误。
出现此问题的原因在于 PECL 的运行方式。PECL 命令本身只是一个 shell 脚本,它首先找出 PHP 安装在系统安装中的位置,然后在命令行上使用多个标志调用 PHP,然后提供主 PECL PHP 脚本文件的路径。PECL shell 脚本使用的问题标志是选项-n
,它告诉 PHP 忽略任何php.ini
文件(因此 PHP 不会加载文件指定的任何其他扩展名php.ini
,在本例中包括 XML)。
-n
通过运行以下两个命令可以看到该标志的影响:
- 首先尝试
php -m
在命令行上运行 - 然后将输出与
php -n -m
当您运行第二个命令时,您应该看不到列出的 XML 扩展,因为-n
标志告诉 PHP 不要解析我们的php.ini
文件。
如果你vi `which pecl`
在命令行上运行,你应该看到 PECL 命令的内容(如上所述,它只是一个 shell 脚本),如果你检查最后一行,你会看到如下内容:
exec $PHP -C -n -q $INCARG -d date.timezone=UTC -d output_buffering=1 -d variables_order=EGPCS -d safe_mode=0 -d register_argc_argv="On" $INCDIR/peclcmd.php "$@"
您应该会看到在和标志-n
之间列出的标志。如果您编辑 PECL shell 脚本,省略该标志,您现在应该能够再次运行 PECL 而不会出现问题。-C
-q
-n
或者,您可以从源代码重新编译 PHP,确保 XML 模块被编译到 PHP 二进制文件中,而不是在运行时从 PHP 扩展模块加载。显然,编辑 PECL shell 脚本以删除该-n
标志只能解决问题,直到重新安装 PECL/PEAR,但希望 PECL/PEAR 的维护者可以使用此修复程序更新他们的存储库。然而,确保 PHP 构建时已编译 XML 支持是解决方案的长期修复,但可能并不适合每个人的情况。
只是为了完整性,如果你运行,vi `which pear`
你会看到一个与 PECL 使用的非常相似的 shell 脚本,但是-n
调用 PHP 的命令中缺少标志,因此 PEAR 命令不会受到这些相同问题的影响。
答案2
我在 ubuntu 上调用 PECL 命令时遇到了这个问题。唯一能帮我的就是安装php-xml
包。首先检查是否已经安装了 XML 模块
php -m
如果你找不到,那么你必须
sudo apt-get install php-pear
它将自动安装 php-xml 包。或者您也可以像这样安装 xml(取决于您使用的 php 版本)
sudo apt-get install php-xml php7.0-xml
如果你找到 xml,那么你必须删除它并重新安装它
sudo apt-get purge php*-xml
sudo apt-get autoremove php*-xml
sudo apt-get install php-xml php7.0-xml
如果你有 RPM 作为包管理器,你可以yum install php-xml
使用yum remove php-xml
答案3
我正在使用 php5.6。
许多答案建议安装 php-xml,但是当我输入特定版本时,它不起作用,例如
sudo apt-get install php5.6-xml
并且一切正常,也许它会对其他人有所帮助。
答案4
完全删除所有 PEAR RPM,然后rm -rf /usr/share/pear/
再次安装 pear 和所有模块。