PECL命令产生一长串错误


47

当前在CentOS 6.5上运行PHP 5.4。

我安装了webtatic php55w软件包,然后通过PECL毫无问题地安装了PEAR + PECL以及redis和mongo。

不久之后,我意识到5.5与我使用的框架不兼容,所以我删除了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

我怎样才能解决这个问题?

Answers:


91

在RedHat EL v6上将PHP安装更新为5.5.14之后,我遇到了此错误。我已经通过Yum软件包管理器安装了PHP,然后需要重新安装一些我正在使用的PHP扩展。在寻找有关解决此问题的技巧时,我遇到了这个问题,现在,我找到了一个可行的解决方案,我想在这里分享我的发现。我在网上找到的其他建议包括擦除和重新安装PECL / PEAR,甚至我的PHP安装也不能解决此问题。最后,经过进一步研究并查看了PECL / PEAR的源代码,我找到了真正的原因。希望以下内容对其他人有帮助:

如果您的PHP安装默认未启用XML,则在尝试运行PECL时可能会看到此错误,但是通常通过PHP扩展模块将XML支持加载到您的PHP安装中(如果./configure --disable-xml在构建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命令不会受到这些相同的问题的影响。


5
史诗般的答案,编辑pecl脚本对我有用。
亚历克斯·罗斯

29
先生...你是圣人。……从字面上看。我将编写一个脚本来扫描每份报纸的itu告,当您去世后,我将告诉梵蒂冈开始圣化过程,并使用此答案作为您在地球上事迹的例子。很棒的答案:)
riwalk

5
谢谢。TLDR;编辑的最后一行/usr/bin/pecl以不使用-n参数。
dtbarne

7
运行sed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer

6
我没有-n最后的命令,pecl不幸的是,一长串的错误仍然存​​在
空白纸上的空白字母

29

当我调用PECL命令时,我只是在ubuntu上遇到了这个问题。唯一帮助我的是安装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-xmlyum remove php-xml


1
php-xml php7.0-xml已安装,但XML模块不在此处
Loenix

出色的回答对我有所帮助
Syed Aqeel

8

我正在使用php5.6。

许多答案建议安装php-xml,但是当我键入特定版本时,它对我不起作用

sudo apt-get install php5.6-xml

一切正常,也许会帮助别人。


适用于php 5.6
devst3r,

在php 7.2,Ubuntu 16.04中为我工作。我的命令是:sudo apt install php7.2-xml。您可以根据需要更新答案以也包括我的命令:)谢谢
voghDev

4

您必须安装php-xml软件包才能修复“找不到XML扩展名”问题


2
在这里更多的解释可能很有用。
kasperd '16

请注意,这个问题已有2年历史了。尽量避免回答老问题,因为这会干扰主屏幕。
凯瑟琳MacInnes

1
我之所以回答,是因为我今天遇到了这个问题,这个解决方案解决了我的问题!
kavehmb

这是我们唯一要做的事情,因为我正在使用php7.2并且我没有编辑任何文件,而是使用命令安装了我的相对版本sudo apt-get install php7.2-xml
Muhammad Omer Aslam

2

完全删除所有PEAR RPM,然后rm -rf /usr/share/pear/再次安装pear和所有模块。


跟进,yum erase php-pear现在一切都很好!谢谢!:)
eComEvo

1
请注意,重新安装时请使用php pear的php54w版本(而不是库存的php-pear软件包)。因此简而言之1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Attila Fulop 2014年

2

以下步骤对我有用。

第1步:

yum erase php-pear

2步:

# rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
# rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm

3步:

 yum install --enablerepo=remi --enablerepo=remi-php56 php-pear

0

PHP7 / Debian人员(相似/相同的原因):

原因是上面提到的缺少XML扩展名。我们必须使用dotdeb,并且已将xml从内置删除为单独的软件包:

来源:https : //www.dotdeb.org/2016/06/24/php-7-0-8-for-jessie/

另请注意,bcmatch,dba,mbstring,soap,xml和zip现在具有各自独立的专用软件包。

这意味着

php -n

将不再包含PEAR包解析器所依赖的xml(XML解析器)。来源pear.php.net/package/PEAR/download

PHP扩展名:xml

由于pecl不使用系统的php.ini是至关重要的,因此要保证在所有情况下都具有功能性(即使功能失常是运行pecl ..的原因),使用-n ..不会改变它,而是dotdeb的人需要最终无需重新测试即可重新包装,重组和转移arround软件包。

随附的PEAR软件包也存在问题,需要升级...由于当前的声誉,不允许发布其他任何内容

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.