Me deparei com esse erro depois de atualizar minha instalação do PHP para 5.5.14, no RedHat EL v6. Instalei o PHP por meio do gerenciador de pacotes Yum e, em seguida, precisei reinstalar algumas das extensões PHP que estava usando. Ao procurar dicas sobre como resolver esse problema, me deparei com essa questão e agora que descobri uma solução funcional, queria compartilhar minhas descobertas aqui. Outras sugestões que encontrei on-line, incluindo a exclusão e reinstalação do PECL / PEAR, e mesmo a minha instalação do PHP não resolveram esse problema. Finalmente, depois de algumas pesquisas e revisão do código fonte do PECL / PEAR, encontrei a causa real. Esperamos que o que se segue ajude outros:
Você pode ver esse erro ao tentar executar o PECL se a instalação do PHP não tiver o XML ativado por padrão, mas o suporte a XML geralmente é carregado na instalação do PHP por meio de um módulo de extensão PHP (isso pode ocorrer se o ./configure --disable-xml
sinalizador for especificado ao criar o PHP da fonte ou se você instalou o PHP por meio de vários gerenciadores de pacotes nos quais essa compilação do PHP está configurada para carregar XML por meio de um módulo de extensão).
Observe como está a última linha da saída de erro do PECL XML Extension not found
- a razão pela qual esse erro está aparecendo é porque, quando o PECL tenta usar sua classe XMLParser.php, ele falha porque não pode acessar a extensão XML (verifica o módulo XML usando a extension_loaded('xml')
linha ao redor) 259 da fonte XMLParser.php) e, como o módulo XML não está disponível, ele não pode analisar seus arquivos de configuração / configurações e gera todos os outros erros vistos acima.
A razão pela qual esse problema ocorre é devido à maneira como o PECL opera. O próprio comando PECL é apenas um script de shell, que primeiro funciona onde o PHP está instalado na instalação do sistema e, em seguida, chama o PHP na linha de comando com um número de sinalizadores antes de fornecer o caminho para o principal arquivo de script PHP do PECL. O sinalizador de problema que o script shell PECL está usando é a -n
opção, que instrui o PHP a ignorar todos os php.ini
arquivos (e, portanto, o PHP não carregará nenhuma das extensões adicionais php.ini
especificadas pelo arquivo, incluindo neste caso o XML).
Pode-se ver o impacto do -n
sinalizador executando os dois comandos a seguir:
- primeiro tente executar
php -m
na linha de comando
- depois compare a saída com
php -n -m
Você não deve ver a extensão XML listada ao executar o segundo comando, porque a -n
flag disse ao PHP para não analisar nosso php.ini
(s) arquivo (s).
Se você executar vi `which pecl`
na linha de comando, deverá ver o conteúdo do comando PECL (como observado acima, é apenas um script de shell) e, se você inspecionar a última linha, verá algo parecido com isto:
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 "$@"
Você deve ver o -n
sinalizador listado entre os sinalizadores -C
e -q
. Se você editar o script do shell PECL, omitindo o -n
sinalizador, você poderá executar o PECL novamente sem problemas.
Como alternativa, você pode recompilar o PHP da fonte, certificando-se de que o módulo XML seja compilado no binário do PHP em vez de ser carregado a partir de um módulo de extensão do PHP em tempo de execução. Obviamente, editar o script de shell do PECL para remover o -n
sinalizador só corrigirá o problema até que o PECL / PEAR seja reinstalado, espero que os mantenedores do PECL / PEAR possam atualizar seu repositório com essa correção. Garantir que o PHP seja construído com o suporte XML compilado é, no entanto, uma correção de longo prazo para a solução, mas pode não ser o ideal para as circunstâncias de todos.
Apenas para completar, se você executar vi `which pear`
, verá um shell script muito semelhante ao que o PECL usa; no entanto, o -n
sinalizador está ausente no comando que chama PHP e, como tal, o comando PEAR não está sujeito a esses mesmos problemas.