Я столкнулся с этой ошибкой после обновления установки 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 не подвержена этим же проблемам.