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-xml
Flag 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 -n
Option, die PHP anweist, alle php.ini
Dateien zu ignorieren (und daher lädt PHP keine der zusätzlichen Erweiterungen, die Ihre php.ini
Datei angibt, einschließlich in diesem Fall XML).
Man kann die Auswirkung des -n
Flags sehen, indem man die folgenden zwei Befehle ausführt:
- Versuchen Sie zunächst,
php -m
auf 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 -n
Flag PHP angewiesen hat, unsere php.ini
Datei (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 -n
Fahne sehen, die zwischen -C
und -q
Fahnen verzeichnet wird. Wenn Sie das PECL-Shell-Skript bearbeiten und das -n
Flag 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 -n
Flag 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 -n
Flag fehlt jedoch in dem Befehl, der PHP aufruft, und daher ist der PEAR-Befehl nicht denselben Problemen unterworfen.
/usr/bin/pecl
, um den Parameter -n nicht zu verwenden.sed -i "$ s|\-n||g" /usr/bin/pecl
-n
im letzten Befehlpecl
leiderIch habe gerade dieses Problem auf Ubuntu konfrontiert, als ich nach PECL-Befehl rief. Das einzige was mir geholfen hat ist das
php-xml
Paket zu installieren . Überprüfen Sie zunächst, ob Sie das XML-Modul bereits mit installiert habenWenn Sie es nicht finden, müssen Sie
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)
Wenn Sie XML finden, müssen Sie es entfernen und neu installieren
Wenn Sie RPM als Paketmanager haben, können Sie
yum install php-xml
und verwendenyum remove php-xml
quelle
Ich benutze PHP5.6.
Viele Antworten empfehlen, php-xml zu installieren, aber es funktioniert bei mir nicht, wenn ich eine bestimmte Version wie z
und alles funktioniert, vielleicht hilft es anderen.
quelle
sudo apt install php7.2-xml
. Sie können die Antwort aktualisieren, um auch meinen BefehlSie müssen das Paket php-xml installieren, um das Problem "XML Extension not found" zu beheben
quelle
php7.2
und keine Dateien bearbeitet habe. Ich habe nur meine relative Version mit dem Befehlsudo apt-get install php7.2-xml
Entfernen Sie alle PEAR-RPMs vollständig und
rm -rf /usr/share/pear/
installieren Sie dann pear und alle Ihre Module erneut.quelle
yum erase php-pear
und jetzt ist alles in Ordnung! Vielen Dank! :)yum erase php-pear
2.rm -rf /usr/share/pear/
3.yum install php54w-pear
Die folgenden Schritte funktionieren für mich.
1 Schritt:
2 Schritt:
3 Schritt:
quelle
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/
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
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
quelle