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.