J'ai rencontré cette erreur après avoir mis à jour mon installation PHP en version 5.5.14, sur RedHat EL v6. J'avais installé PHP via le gestionnaire de paquets Yum, puis j'ai dû 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 qui fonctionne, je voulais partager mes découvertes ici. D'autres suggestions trouvées en ligne, telles que l'effacement et la réinstallation de PECL/PEAR ainsi que de mon installation PHP, n'ont pas résolu ce problème. Enfin, après des recherches supplémentaires et avoir examiné le code source de PECL/PEAR, j'ai trouvé la vraie cause. Espérons que ce qui suit sera utile à d'autres:
Vous pouvez rencontrer cette erreur lorsque vous essayez d'exécuter PECL si votre installation PHP n'a pas XML activé par défaut, mais plutôt le support XML est généralement chargé dans votre installation PHP via un module d'extension PHP (cela pourrait se produire si le drapeau ./configure --disable-xml
a été spécifié lors de la construction de PHP à partir des sources, ou si vous avez installé PHP via divers gestionnaires de paquets où la version de PHP est configurée pour charger XML via un module d'extension).
Remarquez comment la dernière ligne de la sortie d'erreur de PECL est Extension XML non trouvée
- la raison de cette erreur est que lorsque PECL tente d'utiliser sa classe XMLParser.php, cela échoue car il ne peut pas accéder à l'extension XML (il vérifie la présence du module XML en utilisant extension_loaded('xml')
vers la ligne 259 du code source de XMLParser.php), et parce que le module XML est indisponible, il ne peut pas analyser ses fichiers de configuration/réglages et affiche toutes les autres erreurs vues ci-dessus.
La raison pour laquelle ce problème se produit est due à la façon dont PECL fonctionne. La commande PECL est simplement un script shell, qui détermine d'abord où PHP est installé sur votre système, puis appelle PHP en ligne de commande avec plusieurs drapeaux avant de fournir le chemin vers le script PHP principal de PECL. Le drapeau problématique utilisé par le script shell PECL est l'option -n
, qui indique à PHP d'ignorer tout fichier php.ini
(et donc PHP ne chargera pas les extensions supplémentaires spécifiées dans votre fichier php.ini
, y compris dans ce cas, XML).
On peut voir l'impact du drapeau -n
en exécutant les deux commandes suivantes:
- essayez d'abord d'exécuter
php -m
en ligne de commande
- puis comparez la sortie à
php -n -m
Vous ne devriez pas voir l'extension XML répertoriée lorsque vous exécutez la deuxième commande car le drapeau -n
indique à PHP de ne pas analyser nos fichiers php.ini
.
Si vous exécutez vi `which pecl`
en ligne de commande, vous devriez voir le contenu de la commande PECL (comme indiqué ci-dessus, il s'agit simplement d'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 drapeau -n
répertorié entre les drapeaux -C
et -q
. Si vous modifiez le script shell PECL en omettant le drapeau -n
, vous devriez maintenant pouvoir exécuter PECL à nouveau sans problème.
Alternativement, vous pouvez 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. Bien sûr, modifier le script shell PECL pour supprimer le drapeau -n
ne résoudra le problème que jusqu'à ce que PECL/PEAR soit réinstallé, cependant, espérons que les mainteneurs de PECL/PEAR pourront mettre à jour leur dépôt avec cette correction. S'assurer que PHP est construit avec le support XML compilé, est cependant une solution à long terme au problème, mais peut ne pas être idéale pour les circonstances de chacun.
Juste pour plus de complétude, si vous exécutez vi `which pear`
, vous verrez un script shell très similaire à celui que PECL utilise, cependant, le drapeau -n
est manquant de la commande qui appelle PHP et en tant que tel, la commande PEAR n'est pas sujette à ces mêmes problèmes.