O comando PECL produz uma longa lista de erros

47

Atualmente executando o PHP 5.4 no CentOS 6.5.

Instalei o pacote webtatic php55w e instalei o PEAR + PECL sem problemas, juntamente com o redis e o mongo através do PECL.

Logo depois, percebi que o 5.5 não é compatível com a estrutura com a qual estava trabalhando, então apaguei o php55w e instalei o php54w no lugar.

Agora, o comando pecl não funciona. Ele apenas produz essa longa sequência de erros toda vez que emito qualquer comando pecl (abreviado ... mais repetidas dezenas de vezes):

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

Como posso consertar isso?

eComEvo
fonte

Respostas:

91

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-xmlsinalizador 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 -nopção, que instrui o PHP a ignorar todos os php.iniarquivos (e, portanto, o PHP não carregará nenhuma das extensões adicionais php.iniespecificadas pelo arquivo, incluindo neste caso o XML).

Pode-se ver o impacto do -nsinalizador executando os dois comandos a seguir:

  • primeiro tente executar php -mna 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 -nflag 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 -nsinalizador listado entre os sinalizadores -Ce -q. Se você editar o script do shell PECL, omitindo o -nsinalizador, 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 -nsinalizador 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 -nsinalizador está ausente no comando que chama PHP e, como tal, o comando PEAR não está sujeito a esses mesmos problemas.

bluebinary
fonte
5
Resposta épica, editar o script pecl funcionou para mim.
Alex Ross
29
Você senhor ... é um santo. ... ... literalmente. Vou escrever um roteiro que varre os obituários de todos os jornais e, assim que você falecer, direi ao Vaticano que inicie o processo de beatificação, usando esta resposta como exemplo de suas ações na terra. Impressionante resposta :)
riwalk
5
Obrigado. TLDR; edite a última linha de /usr/bin/peclpara não usar o parâmetro -n.
precisa saber é
7
Executesed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer
6
Eu não tenho -nno último comando de pecle a longa lista de erros permanece infelizmente
whiteletters nos whitepapers
29

Eu apenas enfrentei esse problema no ubuntu quando liguei para o comando PECL. A única coisa que me ajudou foi instalar o php-xmlpacote. Primeiro verifique se você já possui o módulo XML instalado com o

php -m

Se você não o encontrar, precisará

sudo apt-get install php-pear

instalará automaticamente o pacote php-xml. ou você pode simplesmente instalar xml como este (dependendo da versão do php que você possui)

sudo apt-get install php-xml php7.0-xml

Se você encontrar o xml, remova-o e reinstale-o

sudo apt-get purge php*-xml
sudo apt-get autoremove php*-xml
sudo apt-get install php-xml php7.0-xml

Se você possui o RPM como gerenciador de pacotes, pode usar yum install php-xmleyum remove php-xml

Taha EL BOUFFI
fonte
1
php-xml php7.0-xml estão instalados, mas módulo XML não está aqui
Loenix
Resposta brilhante que me ajudou
Syed Aqeel
8

Estou usando o php5.6.

Muitas respostas recomendam a instalação do php-xml, mas não está funcionando para mim, quando digito uma versão específica como

sudo apt-get install php5.6-xml

e tudo funciona, talvez ajude os outros.

Hafiz Al Farisyi
fonte
funciona para php 5.6
devst3r
Trabalhou para mim no php 7.2, Ubuntu 16.04. Meu comando foi: sudo apt install php7.2-xml. Você pode atualizar a resposta para incluir também meu comando, se quiser :) obrigado
voghDev
4

você precisa instalar o pacote php-xml para corrigir o problema "Extensão XML não encontrada"

kavehmb
fonte
2
Um pouco mais de explicação pode ser útil aqui.
24516 kasperd
Observe que esta pergunta tem quase 2 anos. Tente evitar responder a perguntas antigas, pois desorganiza a tela inicial.
Catherine MacInnes 24/02
1
A razão pela qual eu respondi foi que encontrei esse problema hoje e essa solução resolveu meu problema!
kavehmb
esta é a única coisa que tinha que fazer, como eu estou usando php7.2e eu não editado quaisquer arquivos acabou de instalar a minha versão relativa usando o comandosudo apt-get install php7.2-xml
Muhammad Omer Aslam
2

Remova completamente os RPMs do PEAR e, em seguida rm -rf /usr/share/pear/, instale o pear novamente e todos os seus módulos.

Florin Asăvoaie
fonte
Seguiu em frente yum erase php-peare agora está tudo bem! Obrigado! :)
eComEvo
1
Observe o uso da versão php54w do php pear ao reinstalar (em vez do pacote padrão do php-pear). Então, em suma 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Attila Fulop
2

Os seguintes passos funcionam para mim.

1 passo:

yum erase php-pear

2 passo:

# 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 passo:

 yum install --enablerepo=remi --enablerepo=remi-php56 php-pear
Gawain Lau
fonte
0

PHP7 / pessoas Debian (similar / mesma razão):

A razão para isso é, como mencionado acima, a extensão XML ausente. Obrigação de nós vai usar Dotdeb , ea ter xml removido de ser build-in para ser um pacote separado:

fonte: https://www.dotdeb.org/2016/06/24/php-7-0-8-for-jessie/

Observe também que bcmatch, dba, mbstring, soap, xml e zip agora têm seus pacotes dedicados separados.

Isso significa que

php -n

não incluirá mais xml, do qual o analisador de pacotes PEAR depende (analisador de XML). Fonte pear.php.net/package/PEAR/download

Extensão PHP: xml

Como é fundamental que o pecl não use o php.ini do sistema, para garantir a funcionalidade em todos os casos (mesmo que a disfuncionalidade seja a razão pela qual você executa o pecl ..), ele não mudará usando -n .. os dotdeb precisam para finalmente parar de reembalar, reestruturar e mudar pacotes espalhados sem sequer testá-lo levemente.

Há também um problema com o pacote PEAR enviado, que precisa ser atualizado com ... não é permitido postar mais nada devido à reputação atual

Eugen Mayer
fonte