Команда PECL створює довгий список помилок


47

Наразі працює PHP 5.4 на CentOS 6.5.

Я встановив webtatic php55w пакет, потім встановив PEAR + PECL без проблем разом з redis та mongo через PECL.

Незабаром я зрозумів, що 5.5 не сумісний з рамкою, з якою я працював, тому я стерв php55w і встановив php54w на своє місце.

Тепер команда pecl взагалі не працює. Він просто створює цю дійсно довгу низку помилок щоразу, коли я видаю будь-яку команду pecl (скорочено ... найбільш повторювану десятки разів):

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

Як я можу це виправити?

Відповіді:


91

Я зіткнувся з цією помилкою після оновлення установки PHP до 5.5.14 на RedHat EL v6. Я встановив PHP через менеджер пакунків Yum, а потім мені потрібно було знову встановити деякі розширення PHP, які я використовував. Шукаючи поради щодо вирішення цього питання, я натрапив на це питання, і тепер, коли я знайшов робоче рішення, я хотів поділитися своїми висновками тут. Інші пропозиції, які я знайшов в Інтернеті, які включали стирання та повторну інсталяцію PECL / PEAR і навіть мою установку PHP, не вирішили цю проблему. Нарешті, після деяких подальших досліджень та перегляду вихідного коду для PECL / PEAR я знайшов справжню причину. Сподіваємось, що наступне допоможе іншим:

Ви можете побачити цю помилку при спробі запуску PECL, якщо у вашій установці PHP не встановлено XML за замовчуванням, але натомість підтримка XML зазвичай завантажується у вашу установку PHP через модуль розширення PHP (це може статися, якщо ./configure --disable-xmlпрапор був вказаний під час створення PHP з джерела або якщо ви встановили PHP через різні менеджери пакунків, де ця збірка PHP налаштована для завантаження XML через модуль розширення).

Зверніть увагу на те, яким є останній рядок виводу помилки з PECL XML Extension not found- причиною появи цієї помилки є те, що коли PECL намагається використовувати клас XMLParser.php, він не працює, оскільки не може отримати доступ до розширення XML (перевіряє модуль XML за допомогою extension_loaded('xml')навколо рядка 259 джерела XMLParser.php), і оскільки модуль XML недоступний, він не може розібрати свої файли конфігурації / налаштувань і видає всі інші помилки, які бачили вище.

Причина, з якою виникає ця проблема, пов'язана з тим, як діє PECL. Сама команда PECL - це лише скрипт оболонки, який спочатку працює, де PHP встановлений у вашій установці системи, а потім викликає PHP у командному рядку з низкою прапорів, перш ніж забезпечити шлях до основного файлу сценарію PECL PHP. Прапор проблеми, який використовує скрипт оболонки PECL, - це -nпараметр, який повідомляє PHP ігнорувати будь-які php.iniфайли (і, отже, PHP не завантажує жодне з додаткових розширень, php.iniвказаних вашим файлом, у тому числі XML).

Можна побачити вплив -nпрапора, виконавши наступні дві команди:

  • спочатку спробуйте запустити php -mв командному рядку
  • потім порівняйте вихід з php -n -m

Ви не повинні бачити розширення XML, вказане під час виконання другої команди, оскільки -nпрапор сказав PHP не розбирати наші php.iniфайли.

Якщо ви запускаєте vi `which pecl`в командному рядку, ви повинні побачити вміст команди PECL (як зазначено вище, її просто сценарій оболонки), і якщо ви оглянете останній рядок, ви побачите щось подібне:

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

Ви повинні побачити -nпрапор, вказаний між прапорами -Cта -qпрапорами. Якщо ви редагуєте скрипт оболонки PECL, опустивши -nпрапор, тепер ви зможете знову запускати PECL без проблем.

Крім того, ви можете перекомпілювати PHP з джерела, переконавшись, що модуль XML збирається у бінарний файл PHP, а не завантажується з модуля розширення PHP під час виконання. Очевидно, що редагування скрипту оболонки PECL для видалення -nпрапора вирішить проблему лише до того часу, поки PECL / PEAR не буде перевстановлена, сподіваємось, проте, підтримуючі PECL / PEAR не зможуть оновити репо з цим виправленням. Забезпечення побудови PHP за допомогою XML-підтримки, складеної в, однак є довгостроковим виправленням рішення, але може не бути ідеальним для всіх обставин.

Для повноти, якщо ви запустите, vi `which pear`ви побачите дуже схожий скрипт оболонки на той, який використовує PECL, проте -nпрапор відсутній у команди, яка викликає PHP, і як така команда PEAR не підпадає під ці ж проблеми.


5
Епічна відповідь, редагування сценарію pecl працював на мене.
Алекс Росс

29
Ви, сер ... - святий. ... ... буквально. Я збираюся написати сценарій, який сканує некрологи кожної газети, і як тільки ти пройдеш, я скажу Ватикану розпочати процес беатифікації, використовуючи цю відповідь як приклад ваших справ на землі. Дивовижна відповідь :)
riwalk

5
Дякую. TLDR; редагуйте останній рядок, /usr/bin/peclщоб не використовувати параметр -n.
dtbarne

7
Запускsed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer

6
Я не маю -nостанньої команди peclі довгий список помилок, на жаль, залишається
білі бюлетені в шпалер

29

Я просто стикався з цією проблемою на ubuntu, коли я викликав команду PECL. Єдине, що мені допомогло - це встановити php-xmlпакет. Спочатку перевірте, чи у вас вже встановлений модуль XML

php -m

Якщо ви цього не знайдете, вам доведеться

sudo apt-get install php-pear

він автоматично встановить пакет php-xml. або ви можете просто встановити xml, як це (залежно від версії php у вас)

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

Якщо ви знайдете xml, ви видалите його та встановіть наново

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

Якщо у вас є RPM як менеджер пакунків, ви можете використовувати yum install php-xmlіyum remove php-xml


1
php-xml php7.0-xml встановлено, але модуля XML тут немає
Loenix

Блискуча відповідь мені допомогла
Syed Aqeel

8

Я використовую php5.6.

Багато відповідей рекомендують встановлювати php-xml, але він не працює для мене, коли я ввожу конкретну версію, як

sudo apt-get install php5.6-xml

і все працює, можливо, це допоможе іншим.


працює для php 5.6
devst3r

Працював для мене в php 7.2, Ubuntu 16.04. Моя команда була: sudo apt install php7.2-xml. Ви можете оновити відповідь, щоб також включити мою команду, якщо хочете :) дякую
voghDev

4

вам потрібно встановити пакет php-xml, щоб виправити проблему "Розширення XML не знайдено"


2
Трохи більше пояснень тут може бути корисним.
kasperd

Зверніть увагу, що це питання майже 2 роки. Намагайтеся уникати відповідей на старі запитання, оскільки це захаращує домашній екран.
Кетрін Макіннес

1
Я відповів на це, що сьогодні я зіткнувся з цією проблемою, і це рішення вирішило моє питання!
kavehmb

це єдине, що нам довелося зробити, оскільки я використовую, php7.2і я не редагував файли, щойно встановили мою відносну версію за допомогою командиsudo apt-get install php7.2-xml
Muhammad Omer Aslam

2

Видаліть усі оберти PEAR повністю, після rm -rf /usr/share/pear/чого знову встановіть грушу та всі свої модулі.


Слідом за цим yum erase php-pearі зараз все добре! Дякую! :)
eComEvo

1
Будь ласка, зверніть увагу, що при перевстановці (замість запасного пакету php-груша) використовуйте версію php54w-версії груші. Так коротше 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Аттіла Фулоп

2

Наступні кроки для мене працюють.

1 крок:

yum erase php-pear

2 крок:

# 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 крок:

 yum install --enablerepo=remi --enablerepo=remi-php56 php-pear

0

PHP7 / Люди Debian (схожа / з тієї ж причини):

Причиною тому є те, як згадувалося вище, відсутнє розширення XML. Потрібно з нас використовувати dotdeb , а ті, що видалили xml, не вбудовуються в окремий пакет:

джерело: https://www.dotdeb.org/2016/06/24/php-7-0-8-for-jessie/

Зауважте також, що bcmatch, dba, mbstring, мило, xml та zip тепер мають окремі спеціальні пакети.

Це означає що

php -n

більше не включатиме xml, від якого залежить аналізатор пакетів PEAR (XML-аналізатор). Джерело pear.php.net/package/PEAR/download

Розширення PHP: xml

Оскільки для pecl критично не використовувати php.ini системи, гарантувати функціональність у всіх випадках (навіть якщо дисфункціональність є причиною запуску pecl ..), вона не зміниться, використовуючи -n .. швидше потрібні хлопці dotdeb нарешті припинити перепаковувати, реструктурувати та переміщувати пакети, навіть не тестуючи їх.

Існує також проблема з поставленим пакетом PEAR, який потрібно оновити ... Не дозволяється публікувати більше нічого через нинішню репутацію

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.