El comando PECL produce una larga lista de errores

47

Actualmente ejecuta PHP 5.4 en CentOS 6.5.

Instalé el paquete webpático php55w y luego instalé PEAR + PECL sin problemas junto con redis y mongo a través de PECL.

Poco después, me di cuenta de que 5.5 no es compatible con el marco con el que estaba trabajando, así que borré php55w e instalé php54w en su lugar.

Ahora el comando pecl no funciona en absoluto. Simplemente produce esta cadena de errores realmente larga cada vez que emito un comando pecl (abreviado ... la mayoría de las veces repetidas):

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

¿Cómo puedo arreglar esto?

eComEvo
fuente

Respuestas:

91

Me encontré con este error después de actualizar mi instalación de PHP a 5.5.14, en RedHat EL v6. Instalé PHP a través del administrador de paquetes Yum, y luego tuve que volver a instalar algunas de las extensiones PHP que estaba usando. Al buscar consejos sobre cómo resolver este problema, me encontré con esta pregunta, y ahora que he descubierto una solución que funcionaba, quería compartir mis hallazgos aquí. Otras sugerencias que había encontrado en línea que incluían borrar y reinstalar PECL / PEAR e incluso mi instalación de PHP no resolvieron este problema. Finalmente, después de investigar y revisar el código fuente de PECL / PEAR, encontré la verdadera causa. Con suerte, lo que sigue será de ayuda para otros:

Es posible que vea este error cuando intente ejecutar PECL si su instalación de PHP no tiene XML habilitado de manera predeterminada, pero en su lugar, el soporte de XML generalmente se carga en su instalación de PHP a través de un módulo de extensión de PHP (esto podría ocurrir si ./configure --disable-xmlse especificó el indicador al construir PHP desde la fuente, o si instaló PHP a través de varios administradores de paquetes donde esa compilación de PHP está configurada para cargar XML a través de un módulo de extensión).

Observe cómo es la última línea de la salida de error de PECL XML Extension not found: la razón por la que aparece este error es porque cuando PECL intenta usar su clase XMLParser.php falla porque no puede acceder a la extensión XML (comprueba el módulo XML usando extension_loaded('xml')alrededor de la línea 259 de la fuente XMLParser.php), y debido a que el módulo XML no está disponible, no puede analizar sus archivos de configuración / configuración y genera todos los otros errores vistos anteriormente.

La razón por la que ocurre este problema se debe a la forma en que opera PECL. El comando PECL en sí mismo es solo un script de shell, que primero funciona donde PHP está instalado en la instalación de su sistema, y ​​luego llama a PHP en la línea de comando con varios indicadores antes de proporcionar la ruta al archivo principal de script PHP PECL. El indicador de problema que utiliza el script de shell PECL es la -nopción, que le dice a PHP que ignore cualquier php.iniarchivo (y, por lo tanto, PHP no cargará ninguna de las extensiones adicionales php.inique especifique su archivo, incluido en este caso XML).

Uno puede ver el impacto de la -nbandera ejecutando los siguientes dos comandos:

  • primero intente ejecutar php -men la línea de comando
  • luego compare la salida con php -n -m

No debería ver la extensión XML en la lista cuando ejecuta el segundo comando porque el -nindicador le dice a PHP que no analice nuestros php.iniarchivos.

Si ejecuta vi `which pecl`en la línea de comando, debería ver el contenido del comando PECL (como se señaló anteriormente, es solo un script de shell), y si inspecciona la última línea, verá algo como esto:

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 "$@"

Debería ver la -nbandera listada entre las banderas -Cy -q. Si edita el script de shell PECL, omitiendo el -nindicador, ahora debería poder ejecutar PECL nuevamente sin problemas.

Alternativamente, puede recompilar PHP desde la fuente asegurándose de que el módulo XML se compila en el binario PHP en lugar de cargarlo desde un módulo de extensión PHP en tiempo de ejecución. Obviamente, editar el script de shell PECL para eliminar el -nindicador solo solucionará el problema hasta que PECL / PEAR se vuelva a instalar, sin embargo, es de esperar que los mantenedores de PECL / PEAR puedan actualizar su repositorio con esta solución. Sin embargo, garantizar que PHP esté construido con soporte XML compilado es una solución a largo plazo para la solución, pero puede no ser ideal para las circunstancias de todos.

Solo para completar, si ejecuta vi `which pear`, verá un script de shell muy similar al que usa PECL, sin embargo, -nfalta el indicador del comando que llama a PHP y, como tal, el comando PEAR no está sujeto a estos mismos problemas.

bluebinary
fuente
55
La respuesta épica, la edición del guión de pecl funcionó para mí.
Alex Ross
29
Usted señor ... es un santo. ... ... literalmente. Voy a escribir un guión que escanee los obituarios de cada periódico, y tan pronto como fallezca, le diré al Vaticano que comience el proceso de beatificación, utilizando esta respuesta como un ejemplo de sus acciones en la tierra. Impresionante respuesta :)
riwalk
55
Gracias. TLDR; edite la última línea de /usr/bin/peclpara no usar el parámetro -n.
dtbarne
77
Runsed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer
66
No tengo -nel último comando de pecly la larga lista de errores sigue siendo lamentablemente
whiteletters en papeles en blanco
29

Acabo de enfrentar este problema en ubuntu cuando llamé al comando PECL. Lo único que me ayudó es instalar el php-xmlpaquete. Primero verifique si ya tiene instalado el módulo XML con

php -m

Si no lo encuentras, entonces tienes que

sudo apt-get install php-pear

instalará automáticamente el paquete php-xml. o simplemente puede instalar xml de esta manera (dependiendo de la versión de php que tenga)

sudo apt-get install php-xml php7.0-xml

Si encuentra xml, debe eliminarlo y volver a instalarlo

sudo apt-get purge php*-xml
sudo apt-get autoremove php*-xml
sudo apt-get install php-xml php7.0-xml

Si tiene RPM como administrador de paquetes, puede usar yum install php-xmlyyum remove php-xml

Taha EL BOUFFI
fuente
1
php-xml php7.0-xml están instalados pero el módulo XML no está aquí
Loenix
Respuesta brillante que me ayudó
Syed Aqeel
8

Estoy usando php5.6.

Muchas respuestas recomiendan instalar php-xml, pero no me funciona cuando escribo una versión específica como

sudo apt-get install php5.6-xml

y todo funciona, tal vez ayude a otros.

Hafiz Al Farisyi
fuente
funciona para php 5.6
devst3r
Me funcionó en php 7.2, Ubuntu 16.04. Mi orden fue: sudo apt install php7.2-xml. Puede actualizar la respuesta para incluir también mi comando si lo desea :) gracias
voghDev
4

debe instalar el paquete php-xml para solucionar el problema "Extensión XML no encontrada"

kavehmb
fuente
2
Un poco más de explicación podría ser útil aquí.
kasperd
Tenga en cuenta que esta pregunta tiene casi 2 años. Trate de evitar responder viejas preguntas, ya que satura la pantalla de inicio.
Catherine MacInnes
1
¡La razón por la que respondí fue que encontré este problema hoy y esta solución resolvió mi problema!
kavehmb
esto es lo único que tuvimos que hacer, ya que estoy usando php7.2y no edité ningún archivo que acaba de instalar mi versión relativa usando el comandosudo apt-get install php7.2-xml
Muhammad Omer Aslam
2

Elimine por completo las RPM de PEAR, rm -rf /usr/share/pear/luego instale nuevamente pear y todos sus módulos.

Florin Asăvoaie
fuente
Seguido con yum erase php-peary ahora todo está bien! ¡Gracias! :)
eComEvo
1
Tenga en cuenta el uso de la versión php54w de php pear al reinstalar (en lugar del paquete php-pear de serie). En resumen 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Attila Fulop
2

Los siguientes pasos me funcionan.

1 paso:

yum erase php-pear

2 pasos:

# 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 pasos:

 yum install --enablerepo=remi --enablerepo=remi-php56 php-pear
Gawain Lau
fuente
0

PHP7 / Debian (similar / mismo motivo):

La razón de esto es, como mencionamos anteriormente, la extensión XML que falta. Mosto de nosotros va a utilizar dotdeb , y el tener xml eliminado de ser la acumulación de de ser un paquete separado:

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

Tenga en cuenta también que bcmatch, dba, mbstring, soap, xml y zip ahora tienen sus paquetes dedicados por separado.

Esto significa que

php -n

ya no incluirá xml, del cual depende el analizador de paquetes PEAR (analizador XML). Fuente pear.php.net/package/PEAR/download

Extensión PHP: xml

Dado que es crítico que pecl no use php.ini del sistema, para garantizar la funcionalidad en todos los casos (incluso si la disfuncionalidad es la razón por la que ejecuta pecl ...) no cambiará usando -n ... más bien los chicos dotdeb necesitan para finalmente detener el reempaquetado, la reestructuración y el cambio de paquetes sin siquiera probarlo ligeramente.

También hay un problema con el paquete PEAR enviado, que debe actualizarse con ... no se permite publicar nada más debido a la reputación actual

Eugen Mayer
fuente