web-dev-qa-db-fra.com

La commande PECL produit une longue liste d'erreurs

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 5.5 n'était pas compatible avec le framework avec lequel je travaillais, j'ai donc effacé php55w et installé php54w à sa place.

Maintenant, la commande pecl ne fonctionne plus du tout. Il produit juste cette très longue chaîne d'erreurs chaque fois que j'émets une commande pecl (en abrégé ... des dizaines de fois la plus 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?

50
eComEvo

Je suis tombé sur cette erreur après avoir mis à jour mon installation PHP vers 5.5.14, sur RedHat EL v6. J'avais installé PHP via le gestionnaire de packages Yum, puis je devais réinstaller certaines des extensions PHP que j'utilisais. En recherchant 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 de travail, je voulais partager mes conclusions ici. D'autres suggestions que j'avais trouvées en ligne, notamment l'effacement et la réinstallation de PECL/PEAR et même mon installation PHP n'ont pas résolu ce problème. Enfin, après quelques recherches supplémentaires et l'examen 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 essayez d'exécuter PECL si votre installation PHP n'a pas XML activé par défaut, mais que la prise en charge XML est généralement chargée dans votre installation PHP via un module d'extension PHP (cela peut se produire si l'indicateur ./configure --disable-xml a été spécifié lors de la construction de PHP à partir de la source, ou si vous avez installé PHP via divers gestionnaires de packages où cette 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 XML Extension not found - la raison pour laquelle cette erreur apparaît est 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 en utilisant extension_loaded('xml') autour de la ligne 259 de la source XMLParser.php), et parce que le module XML n'est pas disponible, il ne peut pas analyser ses fichiers de configuration/paramètres et génère 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 elle-même n'est qu'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 d'accès à la fichier de script PECL PHP principal. L'indicateur de problème que le script PECL utilise est l'option -n, Qui indique à PHP d'ignorer tous les fichiers php.ini (Et donc PHP ne chargera aucun des fichiers les extensions supplémentaires que votre fichier php.ini spécifie, y compris XML dans ce cas).

On peut voir l'impact du drapeau -n En exécutant les deux commandes suivantes:

  • essayez d'abord d'exécuter php -m sur la ligne de commande
  • puis comparez 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'indicateur -n A dit à PHP de ne pas analyser nos fichiers php.ini.

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 l'indicateur -n Répertorié entre les indicateurs -C Et -q. Si vous modifiez le script Shell PECL, en omettant l'indicateur -n, Vous devriez maintenant être en mesure de réexécuter PECL sans problème.

Vous pouvez également recompiler PHP à partir de la source 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. De toute évidence, la modification du script PECL Shell pour supprimer l'indicateur -n Ne résoudra le problème que jusqu'à ce que PECL/PEAR soit réinstallé, mais nous espérons que les responsables de PECL/PEAR pourront mettre à jour leur référentiel avec ce correctif. S'assurer que PHP est construit avec le support XML compilé, est cependant une solution à long terme à la solution, mais peut ne pas être idéal pour les circonstances de chacun.

Juste pour être complet, si vous exécutez vi `which pear` Vous verrez un script Shell très similaire à celui que PECL utilise, cependant l'indicateur -n Est manquant dans la commande qui appelle PHP et en tant que telle, la commande PEAR n'est pas soumise à ces mêmes problèmes.

95
bluebinary

Je viens de faire face à ce problème sur Ubuntu lorsque j'ai appelé la commande PECL. La seule chose qui m'a aidé est d'installer php-xml paquet. Vérifiez d'abord si le module XML est déjà installé avec

php -m

Si vous ne le trouvez pas, vous devez

Sudo apt-get install php-pear

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

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

Si vous trouvez xml, 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 comme gestionnaire de packages, vous pouvez utiliser yum install php-xml et yum remove php-xml

31
Taha EL BOUFFI

J'utilise php5.6.

De nombreuses réponses recommandent d'installer php-xml, mais cela ne fonctionne pas pour moi, lorsque je tape une version spécifique comme

Sudo apt-get install php5.6-xml

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

8
Hafiz Al Farisyi

vous devez installer le package php-xml afin de résoudre le problème "XML Extension not found"

4
kavehmb

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
2
Gawain Lau

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

2
Florin Asăvoaie

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

La raison en est, comment mentionnée ci-dessus, l'extension XML manquante. Nous devons utiliser dotdeb , et avoir supprimé le xml d'être intégré pour être un package 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 maintenant leurs packages dédiés séparés.

Cela signifie que

php -n

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

Extension PHP: xml

Comme il est essentiel que pecl n'utilise pas le php.ini du système, pour garantir la fonctionnalité dans tous les cas (même si la dysfonctionnement est la raison pour laquelle vous exécutez pecl ..), il ne changera pas en utilisant -n .. plutôt que les gars de dotdeb ont besoin pour arrêter enfin le reconditionnement, la restructuration et le décalage des paquets autour sans même le tester légèrement.

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

0
Eugen Mayer