Web

Почему команда PECL выдает длинный список ошибок

В настоящее время я использую PHP 5.4 на CentOS 6.5. Я установил пакет webtatic php55w, затем установил PEAR+PECL без проблем вместе с redis и mongo через PECL. Вскоре после этого я понял, что 5.5 не совместим с фреймворком, с которым я работал, поэтому я yum стер php55w и установил php54w вместо него.

Теперь команда pecl вообще не работает. Она просто выдает очень длинную строку ошибок каждый раз, когда я ввожу любую команду pecl. Что делать?

Ответ 1

Я столкнулся с этой ошибкой после обновления моей установки 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 можно увидеть, выполнив следующие две команды:

  1. сначала попробуйте запустить php -m в командной строке

  2. затем сравните результат с 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 не подвержена этим проблемам.

Ответ 2

Я только что столкнулся с этой проблемой на 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.

Ответ 3

НPHP7/Debian люди (схожая/одинаковая причина):

Причиной этого, как уже упоминалось выше, является отсутствие расширения XML. Многие из нас будут использовать dotdeb, а они убрали xml из встроенного в отдельный пакет:

https://www.dotdeb.org/2016/06/24/php-7-0-8-for-jessie/

Также обратите внимание, что bcmatch, dba, mbstring, soap, xml и zip теперь имеют отдельные выделенные пакеты.

Это означает, что команда:

php -n

больше не будет включать xml, от которого зависит парсер пакетов PEAR (XML parser). Источник pear.php.net/package/PEAR/download

Расширение PHP: xml

Поскольку для pecl очень важно не использовать php.ini системы, чтобы гарантировать работоспособность во всех случаях (даже если неработоспособность является причиной запуска pecl...), это не изменится при использовании -n... скорее, программистам из dotdeb нужно наконец прекратить переупаковывать, реструктурировать и переставлять пакеты, даже не протестировав их.

Есть также проблема с поставляемым пакетом PEAR, который необходимо обновить...

Схожие статьи

Web

Самый простой способ профилировать PHP-скрипт

Web

Проблемы при загрузке нескольких изображений с получением имени папки в базе данных

Web

Как загрузить файл с помощью библиотеки Java HttpClient, работающей с PHP

Что такое веб-дизайнер. Описание профессии и ее подводные камни
Web

Что такое веб-дизайнер. Описание профессии и ее подводные камни