Je suis tombé sur cette erreur après la mise à jour de mon installation PHP vers 5.5.14 sur RedHat EL v6. J'avais installé PHP via le gestionnaire de paquets Yum, puis j'avais besoin de réinstaller certaines des extensions PHP que j'utilisais. En cherchant des conseils sur la façon de résoudre ce problème, je suis tombé sur cette question et, maintenant que j'ai découvert une solution efficace, je souhaitais partager mes conclusions ici. D’autres suggestions que j’avais trouvées en ligne et qui comprenaient l’effacement et la réinstallation de PECL / PEAR et même mon installation de PHP ne résolvaient pas ce problème. Enfin, après quelques recherches supplémentaires et une révision du code source de PECL / PEAR, j’ai trouvé la véritable cause. Espérons que ce qui suit sera utile aux autres:
Vous pouvez voir cette erreur lorsque vous tentez d'exécuter PECL si XML n'est pas activé par défaut sur votre installation PHP. Toutefois, le support XML est généralement chargé dans votre installation PHP via un module d'extension PHP (ceci peut se produire si l' ./configure --disable-xml
indicateur a été spécifié lors de la construction de PHP depuis les sources, ou si vous avez installé PHP via différents gestionnaires de paquets où cette version de PHP est configurée pour charger XML via un module d’extension).
Notez que la dernière ligne de la sortie d'erreur de PECL est XML Extension not found
- la raison de cette erreur est due au fait que lorsque PECL essaie d'utiliser sa classe XMLParser.php, il échoue car il ne peut pas accéder à l'extension XML (il recherche le module XML à l'aide extension_loaded('xml')
de 259 de la source XMLParser.php) et, le module XML n'étant pas disponible, il ne peut pas analyser ses fichiers de configuration / paramètres et génère toutes les autres erreurs décrites ci-dessus.
La raison pour laquelle ce problème se produit est due à la façon dont PECL fonctionne. La commande PECL elle-même est juste un script shell, qui détermine d’abord où PHP est installé sur votre installation système, puis appelle PHP sur la ligne de commande avec un certain nombre d’indicateurs avant de fournir le chemin du fichier de script PHP PECL principal. Le problème avec lequel le script shell PECL utilise est l' -n
option, qui indique à PHP d'ignorer tous les php.ini
fichiers (et par conséquent, PHP ne chargera aucune des extensions supplémentaires php.ini
spécifiées par votre fichier, y compris XML).
On peut voir l'impact de l' -n
indicateur en lançant les deux commandes suivantes:
- d'abord essayer de courir
php -m
sur la ligne de commande
- puis comparer la sortie à
php -n -m
Vous ne devez pas voir l'extension XML répertoriée lorsque vous exécutez la deuxième commande, car l' -n
indicateur a dit à PHP de ne pas analyser nos php.ini
fichiers.
Si vous exécutez vi `which pecl`
sur la ligne de commande, vous devriez voir le contenu de la commande PECL (comme indiqué ci-dessus, c'est juste un script shell), et si vous inspectez la dernière ligne, vous verrez quelque chose comme ceci:
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 "$@"
Vous devriez voir le -n
drapeau énuméré entre les drapeaux -C
et -q
. Si vous éditez le script de shell PECL, en omettant l' -n
indicateur, vous devriez maintenant pouvoir réexécuter PECL sans problème.
Vous pouvez également recompiler PHP à partir des sources en vous assurant que le module XML est compilé dans le binaire PHP au lieu d'être chargé à partir d'un module d'extension PHP au moment de l'exécution. Évidemment, éditer le script de shell PECL pour supprimer l' -n
indicateur ne résoudra le problème que jusqu'à ce que PECL / PEAR soit réinstallé. Toutefois, les responsables de PECL / PEAR peuvent mettre à jour leur rapport avec ce correctif. S'assurer que PHP est construit avec le support XML compilé dans, est cependant un correctif à long terme pour la solution, mais peut ne pas être idéal pour toutes les circonstances.
Pour être complet, si vous exécutez, vi `which pear`
vous verrez un script shell très similaire à celui utilisé par PECL. Toutefois, l' -n
indicateur est absent de la commande qui appelle PHP et, en tant que telle, la commande PEAR n'est pas soumise à ces mêmes problèmes.