Polecenie PECL tworzy długą listę błędów

47

Obecnie korzystam z PHP 5.4 na CentOS 6.5.

Zainstalowałem webtatic pakiet php55w, a następnie bez problemu zainstalowałem PEAR + PECL wraz z redis i mongo przez PECL.

Wkrótce potem zdałem sobie sprawę, że 5.5 nie jest kompatybilny z frameworkiem, z którym pracowałem, więc wymazałem php55w i zainstalowałem php54w na jego miejscu.

Teraz polecenie pecl w ogóle nie działa. Po prostu generuje ten naprawdę długi ciąg błędów za każdym razem, gdy wydam dowolne polecenie pecl (w skrócie ... najczęściej powtarzane dziesiątki razy):

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

Jak mogę to naprawić?

eComEvo
źródło

Odpowiedzi:

91

Ten błąd napotkałem po aktualizacji mojej instalacji PHP do wersji 5.5.14 na RedHat EL v6. Zainstalowałem PHP za pomocą menedżera pakietów Yum, a następnie musiałem ponownie zainstalować niektóre rozszerzenia PHP, których używałem. Szukając wskazówek, jak rozwiązać ten problem, natknąłem się na to pytanie, a teraz, gdy znalazłem działające rozwiązanie, chciałem się tutaj podzielić swoimi odkryciami. Inne sugestie, które znalazłem w Internecie, w tym usuwanie i ponowna instalacja PECL / PEAR, a nawet moja instalacja PHP nie rozwiązała tego problemu. Wreszcie po dalszych badaniach i przeglądzie kodu źródłowego PECL / PEAR znalazłem prawdziwą przyczynę. Mam nadzieję, że poniższe informacje przydadzą się innym:

Ten błąd może pojawić się podczas próby uruchomienia PECL, jeśli instalacja PHP nie ma domyślnie włączonej obsługi XML, ale zamiast tego obsługa XML jest zwykle ładowana do instalacji PHP za pośrednictwem modułu rozszerzającego PHP (może to wystąpić, jeśli ./configure --disable-xmlflaga została podana podczas budowania PHP ze źródła lub jeśli zainstalowałeś PHP za pomocą różnych menedżerów pakietów, w których ta wersja PHP jest skonfigurowana do ładowania XML poprzez moduł rozszerzeń).

Zwróć uwagę, jak wygląda ostatni wiersz wyniku błędu z PECL XML Extension not found- przyczyną tego błędu jest to, że gdy PECL próbuje użyć swojej klasy XMLParser.php, nie udaje mu się, ponieważ nie może uzyskać dostępu do rozszerzenia XML (sprawdza moduł XML za pomocą extension_loaded('xml')linii wokół 259 źródła XMLParser.php), a ponieważ moduł XML jest niedostępny, nie może przeanalizować plików konfiguracji / ustawień i wyświetla wszystkie pozostałe błędy widoczne powyżej.

Przyczyną tego problemu jest sposób działania PECL. Sama komenda PECL jest po prostu skryptem powłoki, który najpierw sprawdza, gdzie PHP jest instalowany w instalacji systemu, a następnie wywołuje PHP w wierszu poleceń z wieloma flagami, zanim poda ścieżkę do głównego pliku skryptu PECL PHP. Flaga problemu, której używa skrypt powłoki PECL, jest -nopcją, która nakazuje PHP zignorować dowolne php.inipliki (a zatem PHP nie załaduje żadnego z dodatkowych rozszerzeń php.iniokreślonych przez plik, w tym w tym przypadku XML).

Wpływ -nflagi można zobaczyć, uruchamiając następujące dwa polecenia:

  • najpierw spróbuj uruchomić php -mw wierszu polecenia
  • następnie porównaj dane wyjściowe z php -n -m

Nie powinieneś widzieć rozszerzenia XML na liście po uruchomieniu drugiego polecenia, ponieważ -nflaga nakazała PHP nie analizować naszych php.iniplików.

Jeśli uruchomisz vi `which pecl`w wierszu poleceń, powinieneś zobaczyć zawartość polecenia PECL (jak wspomniano powyżej, to tylko skrypt powłoki), a jeśli przejrzysz ostatni wiersz, zobaczysz coś takiego:

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

Powinieneś zobaczyć -nflagę wymienioną pomiędzy flagami -Ci -q. Jeśli edytujesz skrypt powłoki PECL, pomijając -nflagę, powinieneś być w stanie ponownie uruchomić PECL bez problemów.

Alternatywnie można ponownie skompilować PHP ze źródła, upewniając się, że moduł XML jest skompilowany do pliku binarnego PHP, zamiast być ładowanym z modułu rozszerzającego PHP w czasie wykonywania. Oczywiście edytowanie skryptu powłoki PECL w celu usunięcia -nflagi naprawi problem tylko do momentu ponownej instalacji PECL / PEAR, ale mam nadzieję, że opiekunowie PECL / PEAR mogą zaktualizować swoje repozytorium za pomocą tej poprawki. Zapewnienie, że PHP jest wbudowane ze skompilowaną obsługą XML, jest jednak długoterminowym rozwiązaniem tego rozwiązania, ale może nie być idealne w każdych okolicznościach.

Dla kompletności, jeśli uruchomisz vi `which pear`, zobaczysz bardzo podobny skrypt powłoki do tego, którego używa PECL, jednak -nbrakuje flagi w poleceniu wywołującym PHP i jako takie polecenie PEAR nie podlega tym samym problemom.

bluebinary
źródło
5
Epicka odpowiedź, edycja skryptu pecl działała dla mnie.
Alex Ross
29
Pan jest ... święty. ... ... dosłownie. Zamierzam napisać scenariusz, który skanuje nekrologi każdej gazety, a gdy tylko odejdziesz, powiem Watykanowi, aby rozpoczął proces beatyfikacyjny, wykorzystując tę ​​odpowiedź jako przykład twoich czynów na ziemi. Niesamowita odpowiedź :)
riwalk
5
Dzięki. TLDR; edytuj ostatni wiersz, /usr/bin/peclaby nie używać parametru -n.
dtbarne
7
Uruchomsed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer,
6
Nie mam -nostatniego polecenia, pecla długa lista błędów pozostaje niestety
whiteletters in blankpapers
29

Właśnie napotkałem ten problem na Ubuntu, kiedy zadzwoniłem po polecenie PECL. Jedyną rzeczą, która pomogła mi, jest instalacja php-xmlpakietu. Najpierw sprawdź, czy masz już zainstalowany moduł XML

php -m

Jeśli go nie znajdziesz, musisz to zrobić

sudo apt-get install php-pear

automatycznie zainstaluje pakiet php-xml. lub możesz po prostu zainstalować xml w ten sposób (w zależności od posiadanej wersji php)

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

Jeśli znajdziesz xml, usuń go i zainstaluj ponownie

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

Jeśli masz RPM jako menedżer pakietów, możesz użyć yum install php-xmliyum remove php-xml

Taha EL BOUFFI
źródło
1
php-xml php7.0-xml są zainstalowane, ale nie ma tu modułu XML
Loenix,
Świetna odpowiedź pomogła mi
Syed Aqeel
8

Używam php5.6.

Wiele odpowiedzi zaleca zainstalowanie php-xml, ale nie działa ono dla mnie, gdy piszę konkretną wersję

sudo apt-get install php5.6-xml

i wszystko działa, może pomoże innym.

Hafiz Al Farisyi
źródło
działa dla php 5.6
devst3r
Pracował dla mnie w PHP 7.2, Ubuntu 16.04. Moje polecenie było: sudo apt install php7.2-xml. Możesz zaktualizować odpowiedź,
dodając
4

musisz zainstalować pakiet php-xml, aby naprawić problem „Nie znaleziono rozszerzenia XML”

kavehmb
źródło
2
Przydałoby się nieco więcej wyjaśnień.
kasperd
Pamiętaj, że to pytanie ma prawie 2 lata. Staraj się unikać odpowiadania na stare pytania, ponieważ zaśmieca ekran główny.
Catherine MacInnes
1
Odpowiedziałem, że napotkałem dzisiaj ten problem i to rozwiązanie rozwiązało mój problem!
kavehmb
to jedyna rzecz, którą musieliśmy zrobić, ponieważ używam php7.2i nie edytowałem żadnych plików, tylko zainstalowałem moją wersję względną za pomocą poleceniasudo apt-get install php7.2-xml
Muhammad Omer Aslam,
2

Usuń całkowicie PEAR RPM, a rm -rf /usr/share/pear/następnie ponownie zainstaluj gruszkę i wszystkie moduły.

Florin Asăvoaie
źródło
Kontynuowałem to yum erase php-peari teraz wszystko jest w porządku! Dzięki! :)
eComEvo
1
Pamiętaj, aby podczas ponownej instalacji używać wersji php gruszki php54w (zamiast standardowego pakietu php-gruszki). W skrócie 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Attila Fulop
2

Poniższe kroki działają dla mnie.

1 krok:

yum erase php-pear

2 krok:

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

 yum install --enablerepo=remi --enablerepo=remi-php56 php-pear
Gawain Lau
źródło
0

Ludzie PHP7 / Debian (podobny / ten sam powód):

Powodem tego jest, jak wspomniano powyżej, brakujące rozszerzenie XML. Moszcz z nas wykorzysta dotdeb i usunęliśmy xml przed build-in do bycia osobny pakiet:

źródło: https://www.dotdeb.org/2016/06/24/php-7-0-8-for-jessie/

Pamiętaj również, że bcmatch, dba, mbstring, soap, xml i zip mają teraz swoje osobne dedykowane pakiety.

To znaczy że

php -n

nie będzie już zawierać xml, od którego zależy analizator pakietów PEAR (analizator XML). Źródło pear.php.net/package/PEAR/download

Rozszerzenie PHP: xml

Ponieważ jest bardzo ważne, aby pecl nie używał php.ini systemu, aby zagwarantować funkcjonalność we wszystkich przypadkach (nawet jeśli niefunkcjonalność jest powodem uruchomienia pecl ..) nie zmieni się przy użyciu -n .. raczej faceci dotdeb potrzebują aby w końcu przestać przepakowywać, restrukturyzować i przenosić pakiety wokół, nawet nie testując go lekko.

Występuje również problem z dostarczonym pakietem PEAR, który należy zaktualizować o ... nie wolno publikować niczego innego z powodu obecnej reputacji

Eugen Mayer
źródło