Me deparei com esse erro após atualizar minha instalação do PHP para 5.5.14, no RedHat EL v6. Eu tinha instalado o PHP através do gerenciador de pacotes Yum, e então precisava reinstalar algumas das extensões PHP que eu estava usando. Na busca de dicas sobre como resolver esse problema, me deparei com essa pergunta e, agora que descobri uma solução de trabalho, quis compartilhar minhas descobertas aqui. Outras sugestões que eu encontrei online, que incluíam apagar e reinstalar o PECL / PEAR e até mesmo a minha instalação do PHP, não resolveram esse problema. Finalmente, após algumas pesquisas e revisão do código-fonte do PECL / PEAR, encontrei a causa real. Espero que o que se segue seja de ajuda para os outros:
Você pode ver este erro ao tentar executar o PECL se a sua instalação do PHP não tem o XML habilitado por padrão, mas o suporte a XML é normalmente carregado em sua instalação PHP através de um módulo de extensão PHP (isso pode ocorrer se o ./configure --disable-xml flag foi especificado ao construir o PHP a partir do código-fonte, ou se você instalou o PHP através de vários gerenciadores de pacotes nos quais a compilação do PHP está configurada para carregar XML através de um módulo de extensão).
Observe como 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 extension_loaded('xml') ao redor da linha 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.
O motivo pelo 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 seu sistema, e então chama o PHP na linha de comando com um número de flags antes de fornecer o caminho para o arquivo principal do script PECL. O sinalizador de problema que o shell script PECL está usando é a opção -n , que diz ao PHP para ignorar qualquer arquivo php.ini (e, portanto, o PHP não carregará nenhuma das extensões adicionais que o arquivo php.ini especificar, incluindo neste caso XML).
Pode-se ver o impacto do sinalizador -n executando os dois comandos a seguir:
- primeiro, execute
php -mna linha de comando - , em seguida, compare a saída com
php -n -m
Você não deve ver a extensão XML listada quando executar o segundo comando porque o -n sinalizou ao PHP para não analisar nosso (s) arquivo (s) php.ini .
Se você executar vi 'which pecl' na linha de comando, deverá ver o conteúdo do comando PECL (como mencionado acima, é apenas um script de shell) e, se você inspecionar a última linha, verá algo assim:
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 sinalizador -n listado entre os sinalizadores -C e -q . Se você editar o shell script do PECL, omitindo o -n flag, você poderá executar o PECL novamente sem problemas.
Como alternativa, você pode recompilar o PHP a partir do código-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, a edição do shell script do PECL para remover o -n flag só corrigirá o problema até que o PECL / PEAR seja reinstalado, mas os mantenedores do PECL / PEAR podem atualizar seu repositório com essa correção. Garantir que o PHP é construído com suporte a XML compilado, é, no entanto, uma correção de longo prazo para a solução, mas pode não ser ideal para as circunstâncias de todos.
Apenas para completar, se você executar vi 'which pear' , verá um script de shell muito semelhante ao que o PECL usa, no entanto, o sinalizador -n está ausente do comando que chama PHP e, como tal, o comando PEAR não é sujeitos a esses mesmos problemas.