PECL命令产生长长的错误列表

目前在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 

我该如何解决这个问题?

在RedHat EL v6上将PHP安装更新到5.5.14后,我发现了这个错误。 我已经通过Yum软件包pipe理器安装了PHP,然后需要重新安装一些我正在使用的PHP扩展。 在寻找如何解决这个问题的提示时,我遇到了这个问题,现在我发现了一个工作解决scheme,我想在这里分享我的发现。 我在网上find的其他build议,包括擦除和重新安装PECL / PEAR,甚至我的PHP安装都没有解决这个问题。 最后,经过对PECL / PEAR的源代码的进一步研究和审查,我find了真正的原因。 希望接下来会对其他人有所帮助:

如果您的PHP安装默认没有启用XML,您可能会在尝试运行PECL时看到这个错误,但是XML支持通常通过PHP扩展模块加载到您的PHP安装中(如果./configure --disable-xml从源代码构buildPHP时指定了./configure --disable-xml标志,或者如果您通过各种软件包pipe理器(通过将PHP构buildconfiguration为通过扩展模块加载XML)来安装PHP)。

注意PECL错误输出的最后一行是XML Extension not found – 这个错误出现的原因是因为当PECL尝试使用它的XMLParser.php类时,它失败了,因为它不能访问XML扩展(它检查XML模块使用XMLParser.php源文件的第259行的extension_loaded('xml') ),并且由于XML模块不可用,所以无法parsing其configuration/设置文件并输出上面看到的所有其他错误。

这个问题发生的原因是由于PECL的运作方式。 PECL命令本身就是一个shell脚本,它首先在您的系统安装中安装PHP的位置,然后在命令行上用多个标志调用PHP,然后提供主PECL PHP脚本文件的path。 PECL shell脚本使用的问题标志是-n选项,它告诉PHP忽略任何php.ini文件(因此PHP不会加载任何php.ini文件指定的附加扩展,在这种情况下包括XML )。

通过运行以下两个命令可以看到-n标志的影响:

  • 首先尝试在命令行上运行php -m
  • 然后将输出与php -n -m进行比较

在运行第二个命令时,不应该看到列出的XML扩展名,因为-n标志告诉PHP不要parsing我们的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 "$@"

你应该看到在-C-q标志之间列出的-n标志。 如果您编辑PECL shell脚本,则省略-n标志,现在应该可以再次运行PECL而没有任何问题。

或者,您可以从源代码重新编译PHP,确保将XML模块编译为PHP二进制文件,而不是在运行时从PHP扩展模块加载。 很明显,编辑PECL shell脚本来删除-n标志只会解决问题,直到PECL / PEAR得到重新安装,但希望PECL / PEAR的维护者可以用这个修补程序更新他们的回购。 确保PHP是使用编译的XML支持构build的,但是这个解决scheme是一个长期的解决scheme,但可能并不适合每个人的情况。

为了完整vi `which pear` ,如果你运行vi `which pear`你会看到一个类似于PECL使用的shell脚本,但是调用PHP的命令缺less-n标志,因此PEAR命令不受这些相同的问题。

当我打电话给PECL命令时,我只是遇到了这个问题。 唯一帮助我的是安装php-xml包。 首先检查你是否已经安装了XML模块

 php -m 

如果你没有find它,那么你必须

 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作为包pipe理器,你可以使用yum install php-xmlyum remove php-xml

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

以下步骤适用于我。

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 

你必须安装php-xml包才能解决“找不到XML Extension”的问题

我使用php5.6。

许多答案build议安装php-xml,但它不适合我,当我键入特定版本

 sudo apt-get install php5.6-xml 

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

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

其原因是,上面提到的缺lessXML扩展。 我们必须使用dotdeb ,并已经从内置中删除xml作为一个单独的包:

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

请注意,bcmatch,dba,mbstring,soap, xml和zip现在都有其独立的专用包。

这意味着

php -n

将不再包含PEAR包parsing器依赖的XML(XMLparsing器)。 来源pear.php.net/package/PEAR/download

PHP扩展:xml

由于pecl不使用系统的php.ini是至关重要的,为了保证所有情况下的function性(即使function失效是你运行pecl的原因),它不会改变使用-n ..而是dotdeb家伙需要终于停止重新包装,重组和转移周围的包裹,甚至没有轻微的testing。

运送的PEAR包也有一个问题,需要升级…因为当前的声望,不允许发布任何其他内容