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

47

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

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

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

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

eComEvo
источник

Ответы:

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

bluebinary
источник
5
Эпический ответ, редактирование скрипта pecl у меня сработало.
Алекс Росс
29
Вы, сэр ... святой. ... ... буквально. Я собираюсь написать сценарий, который сканирует некрологи каждой газеты, и как только вы умрете, я скажу Ватикану начать процесс беатификации, используя этот ответ в качестве примера ваших поступков на земле. Потрясающий ответ :)
riwalk
5
Благодарю. TLDR; отредактируйте последнюю строку, /usr/bin/peclчтобы не использовать параметр -n.
dtbarne
7
Runsed -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
Блестящий ответ мне помог
Сайед Акил
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 не найдено»

kavehmb
источник
2
Немного больше объяснений может быть полезно здесь.
Касперд
Обратите внимание, что этому вопросу уже почти 2 года. Старайтесь не отвечать на старые вопросы, так как он загромождает домашний экран.
Кэтрин Макиннес
1
Причина, по которой я ответил на это, состояла в том, что я столкнулся с этой проблемой сегодня, и это решение решило мою проблему!
kavehmb
это единственное, что мы должны были сделать, так как я использую php7.2и не редактировал файлы, только что установил мою относительную версию с помощью командыsudo apt-get install php7.2-xml
Мухаммед Омер Аслам
2

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

Florin Asăvoaie
источник
За этим последовало yum erase php-pearи теперь все хорошо! Спасибо! :)
eComEvo
1
Обратите внимание на использование php54w версии php pear при переустановке (вместо стандартного пакета php-pear). Итак, вкратце 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, soap, xml и zip теперь имеют свои отдельные выделенные пакеты.

Это значит, что

php -n

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

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

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

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

Евгений Майер
источник