La commande PECL produit une longue liste d'erreurs

47

Actuellement en cours d'exécution PHP 5.4 sur CentOS 6.5.

J'ai installé le paquet webtatic php55w puis installé PEAR + PECL sans problème avec redis et mongo via PECL.

Peu de temps après, j'ai réalisé que la version 5.5 n'était pas compatible avec le framework sur lequel je travaillais. J'ai donc supprimé php55w et installé php54w à la place.

Maintenant, la commande pecl ne fonctionne pas du tout. Cela produit juste cette longue chaîne d’erreurs chaque fois que j’émets une commande pecl (en abrégé ... la plupart des dizaines de fois répétée):

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

Comment puis-je réparer cela?

eComEvo
la source

Réponses:

91

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-xmlindicateur 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' -noption, qui indique à PHP d'ignorer tous les php.inifichiers (et par conséquent, PHP ne chargera aucune des extensions supplémentaires php.inispécifiées par votre fichier, y compris XML).

On peut voir l'impact de l' -nindicateur en lançant les deux commandes suivantes:

  • d'abord essayer de courir php -msur 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' -nindicateur a dit à PHP de ne pas analyser nos php.inifichiers.

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 -ndrapeau énuméré entre les drapeaux -Cet -q. Si vous éditez le script de shell PECL, en omettant l' -nindicateur, 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' -nindicateur 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' -nindicateur 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.

bluebinary
la source
5
Réponse épique, éditer le script pecl a fonctionné pour moi.
Alex Ross
29
Vous monsieur ... êtes un saint. ... ... Littéralement. Je vais écrire un script qui lit les notices nécrologiques de chaque journal et, dès votre décès, je vais dire au Vatican de commencer le processus de béatification, en utilisant cette réponse comme exemple de vos actes sur la Terre. Réponse
géniale
5
Merci. TLDR; Editez la dernière ligne /usr/bin/peclpour ne pas utiliser le paramètre -n.
mardi
7
Runsed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer
6
Je n'ai pas -nla dernière commande de peclet la longue liste d'erreurs reste malheureusement
whiteletters in blankpapers
29

J'ai juste fait face à ce problème sur Ubuntu quand j'ai appelé pour la commande PECL. La seule chose qui m'a aidé est d'installer le php-xmlpaquet. Commencez par vérifier si le module XML est déjà installé avec

php -m

Si vous ne le trouvez pas, alors vous devez

sudo apt-get install php-pear

il installera automatiquement le paquet php-xml. ou vous pouvez simplement installer xml comme ceci (selon la version de php que vous avez)

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

Si vous trouvez xml alors vous devez le supprimer et le réinstaller

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

Si vous avez RPM en tant que gestionnaire de paquets, vous pouvez utiliser yum install php-xmletyum remove php-xml

Taha EL BOUFFI
la source
1
php-xml php7.0-xml sont installés mais le module XML n'est pas là
Loenix
Brilliant réponse cela m'a aidé
Syed Aqeel
8

Im en utilisant PHP5.6.

Beaucoup de réponses recommandent d'installer php-xml, mais ça ne marche pas pour moi, quand je tape une version spécifique comme

sudo apt-get install php5.6-xml

et tout fonctionne, peut-être que cela aidera les autres.

Hafiz Al Farisyi
la source
fonctionne pour php 5.6
devst3r
Travaillé pour moi en PHP 7.2, Ubuntu 16.04. Ma commande était: sudo apt install php7.2-xml. Vous pouvez mettre à jour la réponse pour inclure également ma commande si vous le souhaitez :) merci
voghDev
4

vous devez installer le paquet php-xml pour corriger le problème "Extension XML introuvable"

Kavehmb
la source
2
Un peu plus d'explication pourrait être utile ici.
Kasperd
Veuillez noter que cette question a presque 2 ans. Essayez d'éviter de répondre à de vieilles questions car cela encombrerait l'écran d'accueil.
Catherine MacInnes
1
La raison pour laquelle j'ai répondu à cela, c'est que j'ai rencontré ce problème aujourd'hui et que cette solution a résolu mon problème!
kavehmb
C’est la seule chose que nous devions faire, car j’utilise php7.2et je n’ai pas édité de fichiers venant d’installer ma version relative à l’aide de la commandesudo apt-get install php7.2-xml
Muhammad Omer Aslam
2

Supprimez complètement les RPM PEAR, puis rm -rf /usr/share/pear/réinstallez pear et tous vos modules.

Florin Asăvoaie
la source
Suivi cela avec yum erase php-pearet maintenant tout va bien! Merci! :)
eComEvo
1
S'il vous plaît noter en utilisant la version php54w de php pear lors de la réinstallation (au lieu du paquet stock php-pear). Donc, en bref 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Attila Fulop
2

Les étapes suivantes fonctionnent pour moi.

1 étape:

yum erase php-pear

2 étapes:

# 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 étapes:

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

Personnes PHP7 / Debian (similaire / même raison):

La raison en est, comment, mentionnons plus haut, l’extension XML manquante. Doit d’entre nous utiliserons dotdeb , et ils ont supprimé le code XML de l’ installation en tant que paquet séparé:

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

Veuillez également noter que bcmatch, dba, mbstring, soap, xml et zip ont désormais leurs packages dédiés distincts.

Cela signifie que

php -n

n'inclura plus xml, dont dépend l'analyseur de paquets PEAR (analyseur XML). Source pear.php.net/package/PEAR/download

Extension PHP: xml

Comme il est essentiel pour pecl de ne pas utiliser php.ini du système, pour garantir la fonctionnalité dans tous les cas (même si le dysfonctionnement est la raison pour laquelle vous exécutez pecl ..), il ne changera pas avec -n .. pour enfin arrêter le reconditionnement, la restructuration et le transfert des paquets sans même le tester légèrement.

Il existe également un problème avec le package PEAR livré, qui doit être mis à niveau avec ... ne pas être autorisé à publier quoi que ce soit en raison de la réputation actuelle.

Eugen Mayer
la source