PECL 命令产生一长串错误

PECL 命令产生一长串错误

当前在 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 和所有模块。

相关内容