Я столкнулся с этой ошибкой после обновления установки 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 не подвержена этим же проблемам.
/usr/bin/pecl
чтобы не использовать параметр -n.sed -i "$ s|\-n||g" /usr/bin/pecl
-n
последней команды,pecl
и длинный список ошибок, к сожалению, осталсяЯ только что столкнулся с этой проблемой в Ubuntu, когда я вызвал команду PECL. Единственное, что мне помогло, это установить
php-xml
пакет. Сначала проверьте, установлен ли модуль XML сЕсли вы не найдете его, то вам придется
он автоматически установит пакет php-xml. или вы можете просто установить xml следующим образом (в зависимости от версии php)
Если вы найдете XML, то вы должны удалить его и переустановить
Если у вас есть RPM в качестве менеджера пакетов, вы можете использовать
yum install php-xml
иyum remove php-xml
источник
Я использую php5.6.
Многие ответы рекомендуют установить php-xml, но у меня не работает, когда я набираю конкретную версию, например
и все работает, может быть, это поможет другим.
источник
sudo apt install php7.2-xml
. Вы можете обновить ответ, включив в него мою команду, если хотите :) спасибовам нужно установить пакет php-xml, чтобы исправить проблему «Расширение XML не найдено»
источник
php7.2
и не редактировал файлы, только что установил мою относительную версию с помощью командыsudo apt-get install php7.2-xml
Полностью удалите все PEAR RPM, затем
rm -rf /usr/share/pear/
снова установите грушу и все ваши модули.источник
yum erase php-pear
и теперь все хорошо! Спасибо! :)yum erase php-pear
2.rm -rf /usr/share/pear/
3.yum install php54w-pear
Следующие шаги работают для меня.
1 шаг:
2 шага:
3 шага:
источник
PHP7 / Debian люди (аналогично / по той же причине):
Причиной тому, как упомянуто выше, является отсутствующее расширение XML. Многие из нас будут использовать dotdeb , и они удалили xml из встроенного в отдельный пакет:
источник: https://www.dotdeb.org/2016/06/24/php-7-0-8-for-jessie/
Это значит, что
php -n
больше не будет включать xml, от которого зависит парсер пакетов PEAR (парсер XML). Источник pear.php.net/package/PEAR/download
Поскольку для pecl крайне важно не использовать php.ini системы, чтобы гарантировать функциональность во всех случаях (даже если причиной запуска pecl является неработоспособность), она не изменится с помощью -n .. скорее, ребята из dotdeb чтобы наконец прекратить переупаковку, реструктуризацию и перенос пакетов arround без даже небольшого тестирования.
Существует также проблема с поставленным пакетом PEAR, который необходимо обновить до ... запрещено размещать что-либо еще из-за текущей репутации
источник