Я зіткнувся з цією помилкою після оновлення установки 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 не підпадає під ці ж проблеми.