Назад | Перейти на главную страницу

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

В настоящее время работает PHP 5.4 на CentOS 6.5.

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

Вскоре после этого я понял, что 5.5 несовместим с фреймворком, с которым я работал, поэтому yum стер 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

Как я могу это исправить?

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

  • сначала попробуйте бежать php -m в командной строке
  • затем сравните вывод с php -n -m

Вы не должны видеть расширение XML в списке при запуске второй команды, потому что -n flag сказал 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 flag, теперь вы сможете снова запустить PECL без проблем.

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

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

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

Я использую php5.6.

Многие ответы рекомендуют установить php-xml, но у меня он не работает, когда я набираю конкретную версию, например

sudo apt-get install php5.6-xml

и все работает, может другим поможет.

вам необходимо установить пакет php-xml, чтобы исправить проблему «XML Extension not found»

Полностью удалите все RPM PEAR, затем rm -rf /usr/share/pear/ затем снова установите грушу и все свои модули.

Следующие шаги работают для меня.

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

Люди 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). Источник pear.php.net/package/PEAR/download

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

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

Также существует проблема с отправленным пакетом PEAR, который необходимо обновить до ... не разрешено публиковать что-либо еще из-за текущей репутации