Der PECL-Befehl erzeugt eine lange Liste von Fehlern

47

Derzeit läuft PHP 5.4 unter CentOS 6.5.

Ich habe das webtatic php55w-Paket installiert und dann PEAR + PECL ohne Probleme zusammen mit Redis und Mongo über PECL installiert.

Kurz darauf wurde mir klar, dass 5.5 nicht mit dem Framework kompatibel ist, mit dem ich gearbeitet habe. Also habe ich PHP55W gelöscht und PHP54W an seiner Stelle installiert.

Jetzt funktioniert der Befehl pecl überhaupt nicht mehr. Es erzeugt nur diese wirklich lange Folge von Fehlern, wenn ich einen Pecl-Befehl gebe (abgekürzt ... Dutzende Male wiederholt):

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

Wie kann ich das beheben?

eComEvo
quelle

Antworten:

91

Ich bin auf diesen Fehler gestoßen, nachdem ich meine PHP-Installation auf RedHat EL v6 auf 5.5.14 aktualisiert hatte. Ich hatte PHP über den Yum-Paketmanager installiert und musste dann einige der von mir verwendeten PHP-Erweiterungen neu installieren. Auf der Suche nach Tipps zur Lösung dieses Problems bin ich auf diese Frage gestoßen. Nachdem ich nun eine funktionierende Lösung gefunden habe, wollte ich meine Ergebnisse hier mitteilen. Andere Vorschläge, die ich online gefunden hatte, einschließlich des Löschens und erneuten Installierens von PECL / PEAR und sogar meiner PHP-Installation, lösten dieses Problem nicht. Nach einigen weiteren Recherchen und Überprüfungen des Quellcodes für PECL / PEAR fand ich schließlich die wahre Ursache. Hoffentlich hilft das Folgende anderen:

Möglicherweise wird dieser Fehler angezeigt, wenn Sie versuchen, PECL auszuführen, wenn für Ihre PHP-Installation standardmäßig kein XML aktiviert ist. Stattdessen wird die XML-Unterstützung normalerweise über ein PHP-Erweiterungsmodul in Ihre PHP-Installation geladen (dies kann auftreten, wenn das ./configure --disable-xmlFlag beim Erstellen von PHP angegeben wurde aus dem Quellcode oder wenn Sie PHP über verschiedene Paketmanager installiert haben, in denen dieser PHP-Build so konfiguriert ist, dass XML über ein Erweiterungsmodul geladen wird).

Beachten Sie, wie die letzte Zeile der Fehlerausgabe von PECL ist XML Extension not found- der Grund , warum dieser Fehler erscheint , ist , weil , wenn PECL versucht , seine XMLParser.php Klasse zu verwenden , es schlägt fehl , weil es nicht die XML - Erweiterung zugreifen kann (es prüft , ob das XML - Modul extension_loaded('xml')um die Linie 259 der XMLParser.php-Quelle) und da das XML-Modul nicht verfügbar ist, kann es seine Konfigurations- / Einstellungsdateien nicht analysieren und gibt alle anderen oben genannten Fehler aus.

Der Grund für dieses Problem liegt in der Funktionsweise von PECL. Der PECL-Befehl selbst ist nur ein Shell-Skript, das zuerst ermittelt, wo PHP auf Ihrer Systeminstallation installiert ist, und dann PHP in der Befehlszeile mit einer Reihe von Flags aufruft, bevor der Pfad zur Haupt-PECL-PHP-Skriptdatei angegeben wird. Das Problem-Flag, das das PECL-Shell-Skript verwendet, ist die -nOption, die PHP anweist, alle php.iniDateien zu ignorieren (und daher lädt PHP keine der zusätzlichen Erweiterungen, die Ihre php.iniDatei angibt, einschließlich in diesem Fall XML).

Man kann die Auswirkung des -nFlags sehen, indem man die folgenden zwei Befehle ausführt:

  • Versuchen Sie zunächst, php -mauf der Befehlszeile auszuführen
  • Vergleichen Sie dann die Ausgabe mit php -n -m

Sie sollten die XML-Erweiterung nicht sehen, wenn Sie den zweiten Befehl ausführen, weil das -nFlag PHP angewiesen hat, unsere php.iniDatei (en) nicht zu analysieren .

Wenn Sie vi `which pecl`in der Befehlszeile ausgeführt werden, sollten Sie den Inhalt des PECL-Befehls sehen (wie oben erwähnt, es ist nur ein Shell-Skript). Wenn Sie die letzte Zeile überprüfen, sehen Sie etwa Folgendes:

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 "$@"

Sie sollten die -nFahne sehen, die zwischen -Cund -qFahnen verzeichnet wird. Wenn Sie das PECL-Shell-Skript bearbeiten und das -nFlag weglassen , sollten Sie nun in der Lage sein, PECL erneut ohne Probleme auszuführen.

Alternativ können Sie PHP aus dem Quellcode neu kompilieren, indem Sie sicherstellen, dass das XML-Modul in die PHP-Binärdatei kompiliert wird, anstatt zur Laufzeit von einem PHP-Erweiterungsmodul geladen zu werden. Wenn Sie das PECL-Shell-Skript bearbeiten, um das -nFlag zu entfernen, wird das Problem nur behoben, bis PECL / PEAR erneut installiert wird. Hoffentlich können die Betreuer von PECL / PEAR ihr Repo jedoch mit diesem Fix aktualisieren. Die Sicherstellung, dass PHP mit integrierter XML-Unterstützung erstellt wurde, ist zwar eine langfristige Lösung, aber möglicherweise nicht für alle Situationen geeignet.

Der Vollständigkeit halber wird beim Ausführen vi `which pear`ein Shell-Skript angezeigt, das dem von PECL verwendeten sehr ähnlich ist. Das -nFlag fehlt jedoch in dem Befehl, der PHP aufruft, und daher ist der PEAR-Befehl nicht denselben Problemen unterworfen.

bläulich
quelle
5
Epische Antwort, das Bearbeiten des PECL-Skripts hat bei mir funktioniert.
Alex Ross
29
Sie Sir ... sind ein Heiliger. buchstäblich. Ich werde ein Skript schreiben, das die Todesanzeigen jeder Zeitung scannt, und sobald Sie sterben, werde ich den Vatikan auffordern, den Seligsprechungsprozess zu beginnen, wobei ich diese Antwort als Beispiel für Ihre Taten auf Erden verwende. Ehrfürchtige Antwort :)
Riwalk
5
Vielen Dank. TLDR; Bearbeiten Sie die letzte Zeile von /usr/bin/pecl, um den Parameter -n nicht zu verwenden.
dtbarne
7
Runsed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer
6
Ich habe -nim letzten Befehl peclleider
keine
29

Ich habe gerade dieses Problem auf Ubuntu konfrontiert, als ich nach PECL-Befehl rief. Das einzige was mir geholfen hat ist das php-xmlPaket zu installieren . Überprüfen Sie zunächst, ob Sie das XML-Modul bereits mit installiert haben

php -m

Wenn Sie es nicht finden, müssen Sie

sudo apt-get install php-pear

Das PHP-XML-Paket wird automatisch installiert. oder du kannst einfach xml wie folgt installieren (abhängig von der Version von PHP, die du hast)

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

Wenn Sie XML finden, müssen Sie es entfernen und neu installieren

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

Wenn Sie RPM als Paketmanager haben, können Sie yum install php-xmlund verwendenyum remove php-xml

Taha EL BOUFFI
quelle
1
php-xml php7.0-xml sind installiert, aber das XML-Modul ist nicht hier
Loenix
Geniale Antwort, es hat mir geholfen
Syed Aqeel
8

Ich benutze PHP5.6.

Viele Antworten empfehlen, php-xml zu installieren, aber es funktioniert bei mir nicht, wenn ich eine bestimmte Version wie z

sudo apt-get install php5.6-xml

und alles funktioniert, vielleicht hilft es anderen.

Hafiz Al Farisyi
quelle
arbeitet für PHP 5.6
devst3r
Arbeitete für mich in PHP 7.2, Ubuntu 16.04. Mein Befehl war: sudo apt install php7.2-xml. Sie können die Antwort aktualisieren, um auch meinen Befehl
einzuschließen,
4

Sie müssen das Paket php-xml installieren, um das Problem "XML Extension not found" zu beheben

kavehmb
quelle
2
Ein bisschen mehr Erklärung könnte hier nützlich sein.
Kasperd
Bitte beachten Sie, dass diese Frage fast 2 Jahre alt ist. Vermeiden Sie es, alte Fragen zu beantworten, da dies den Startbildschirm überfüllt.
Catherine MacInnes
1
Der Grund, warum ich darauf geantwortet habe, war, dass ich heute auf dieses Problem gestoßen bin und diese Lösung mein Problem gelöst hat!
Kavehmb
Dies ist das einzige, was wir tun mussten, da ich es verwende php7.2und keine Dateien bearbeitet habe. Ich habe nur meine relative Version mit dem Befehlsudo apt-get install php7.2-xml
Muhammad Omer Aslam
2

Entfernen Sie alle PEAR-RPMs vollständig und rm -rf /usr/share/pear/installieren Sie dann pear und alle Ihre Module erneut.

Florin Asăvoaie
quelle
Hat das nachgeholt yum erase php-pearund jetzt ist alles in Ordnung! Vielen Dank! :)
eComEvo
1
Bitte beachten Sie, dass Sie bei der Neuinstallation die php54w-Version von php pear verwenden (anstelle des originalen php-pear-Pakets). Also in Kürze 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Attila Fulop
2

Die folgenden Schritte funktionieren für mich.

1 Schritt:

yum erase php-pear

2 Schritt:

# 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 Schritt:

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

PHP7 / Debian-Leute (ähnlicher / gleicher Grund):

Der Grund dafür ist, wie oben erwähnt, die fehlende XML-Erweiterung. Muss von uns verwenden Dotdeb , und das muß entfernt xml entfernt, build-in zu einem separaten Paket zu sein:

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

Bitte beachten Sie auch, dass bcmatch, dba, mbstring, soap, xml und zip jetzt separate Pakete haben.

Das bedeutet, dass

php -n

Enthält keine XML-Datei mehr, von der der PEAR-Paketparser abhängt (XML-Parser). Quelle pear.php.net/package/PEAR/download

PHP-Erweiterung: xml

Da es für pecl wichtig ist, die php.ini des Systems nicht zu verwenden, um die Funktionalität in allen Fällen zu gewährleisten (auch wenn die Disfunktionalität der Grund ist, warum Sie pecl ausführen), ändert sich dies nicht mit -n um das Umpacken, Umstrukturieren und Verschieben von Paketen endlich zu stoppen, ohne sie auch nur geringfügig zu testen.

Es gibt auch ein Problem mit dem mitgelieferten PEAR-Paket, das aktualisiert werden muss, um ... aufgrund der aktuellen Reputation nichts anderes veröffentlichen zu können

Eugen Mayer
quelle