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.