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-xml
se 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 -n
opción, que le dice a PHP que ignore cualquier php.ini
archivo (y, por lo tanto, PHP no cargará ninguna de las extensiones adicionales php.ini
que especifique su archivo, incluido en este caso XML).
Uno puede ver el impacto de la -n
bandera ejecutando los siguientes dos comandos:
- primero intente ejecutar
php -m
en 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 -n
indicador le dice a PHP que no analice nuestros php.ini
archivos.
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 -n
bandera listada entre las banderas -C
y -q
. Si edita el script de shell PECL, omitiendo el -n
indicador, 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 -n
indicador 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, -n
falta el indicador del comando que llama a PHP y, como tal, el comando PEAR no está sujeto a estos mismos problemas.
/usr/bin/pecl
para no usar el parámetro -n.sed -i "$ s|\-n||g" /usr/bin/pecl
-n
el último comando depecl
y la larga lista de errores sigue siendo lamentablementeAcabo de enfrentar este problema en ubuntu cuando llamé al comando PECL. Lo único que me ayudó es instalar el
php-xml
paquete. Primero verifique si ya tiene instalado el módulo XML conSi no lo encuentras, entonces tienes que
instalará automáticamente el paquete php-xml. o simplemente puede instalar xml de esta manera (dependiendo de la versión de php que tenga)
Si encuentra xml, debe eliminarlo y volver a instalarlo
Si tiene RPM como administrador de paquetes, puede usar
yum install php-xml
yyum remove php-xml
fuente
Estoy usando php5.6.
Muchas respuestas recomiendan instalar php-xml, pero no me funciona cuando escribo una versión específica como
y todo funciona, tal vez ayude a otros.
fuente
sudo apt install php7.2-xml
. Puede actualizar la respuesta para incluir también mi comando si lo desea :) graciasdebe instalar el paquete php-xml para solucionar el problema "Extensión XML no encontrada"
fuente
php7.2
y no edité ningún archivo que acaba de instalar mi versión relativa usando el comandosudo apt-get install php7.2-xml
Elimine por completo las RPM de PEAR,
rm -rf /usr/share/pear/
luego instale nuevamente pear y todos sus módulos.fuente
yum erase php-pear
y ahora todo está bien! ¡Gracias! :)yum erase php-pear
2.rm -rf /usr/share/pear/
3.yum install php54w-pear
Los siguientes pasos me funcionan.
1 paso:
2 pasos:
3 pasos:
fuente
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/
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
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
fuente