eCo*_*Evo 52 php pecl pear php-fpm centos6
目前在 CentOS 6.5 上运行 PHP 5.4。
我安装了 webtatic php55w 包,然后通过 PECL 安装了 PEAR+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
Run Code Online (Sandbox Code Playgroud)
我怎样才能解决这个问题?
小智 97
在 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')绕行检查 XML 模块XMLParser.php 源代码的 259),并且由于 XML 模块不可用,它无法解析其配置/设置文件并输出上面看到的所有其他错误。
出现此问题的原因是 PECL 的运行方式。PECL 命令本身只是一个 shell 脚本,它首先计算出系统安装中 PHP 的安装位置,然后在提供主 PECL PHP 脚本文件的路径之前在命令行上调用带有多个标志的 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在-C和-q标志之间列出的标志。如果您编辑 PECL shell 脚本,省略该-n标志,您现在应该能够再次运行 PECL 而不会出现问题。
或者,您可以从源代码重新编译 PHP,确保将 XML 模块编译到 PHP 二进制文件中,而不是在运行时从 PHP 扩展模块加载。显然,编辑 PECL shell 脚本以删除-n标志只会在重新安装 PECL/PEAR 之前解决问题,但希望 PECL/PEAR 的维护者可以使用此修复程序更新他们的存储库。确保 PHP 是在编译 XML 支持的情况下构建的,这是解决方案的长期修复,但可能并不适合每个人的情况。
为了完整起见,如果您运行,vi `which pear`您将看到一个与 PECL 使用的非常相似的 shell 脚本,但是-n调用 PHP 的命令中缺少标志,因此 PEAR 命令不受这些相同问题的影响。
小智 34
当我调用 PECL 命令时,我刚刚在 ubuntu 上遇到了这个问题。唯一帮助我的是安装php-xml包。首先检查您是否已经安装了 XML 模块
php -m
Run Code Online (Sandbox Code Playgroud)
如果你没有找到它,那么你必须
sudo apt-get install php-pear
Run Code Online (Sandbox Code Playgroud)
它将自动安装 php-xml 包。或者你可以像这样安装xml(取决于你拥有的php版本)
sudo apt-get install php-xml php7.0-xml
Run Code Online (Sandbox Code Playgroud)
如果你找到 xml 那么你已经删除它并重新安装它
sudo apt-get purge php*-xml
sudo apt-get autoremove php*-xml
sudo apt-get install php-xml php7.0-xml
Run Code Online (Sandbox Code Playgroud)
如果你有 RPM 作为包管理器,你可以使用yum install php-xml和yum remove php-xml
小智 8
我使用 php5.6。
许多答案建议安装 php-xml,但当我输入特定版本时,它对我不起作用
sudo apt-get install php5.6-xml
Run Code Online (Sandbox Code Playgroud)
一切正常,也许它会帮助别人。