Il comando PECL produce un lungo elenco di errori


47

Attualmente in esecuzione PHP 5.4 su CentOS 6.5.

Ho installato il pacchetto webtatic php55w, quindi ho installato PEAR + PECL senza problemi insieme a redis e mongo tramite PECL.

Poco dopo, ho capito che 5.5 non è compatibile con il framework con cui stavo lavorando, quindi ho cancellato php55w e ho installato php54w al suo posto.

Ora il comando pecl non funziona affatto. Produce solo questa lunga serie di errori ogni volta che invio qualsiasi comando pecl (abbreviato ... più volte dozzine di volte):

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

Come posso risolvere questo problema?

Risposte:


91

Ho riscontrato questo errore dopo aver aggiornato la mia installazione di PHP alla 5.5.14, su RedHat EL v6. Avevo installato PHP tramite il gestore pacchetti Yum, e quindi avevo bisogno di reinstallare alcune delle estensioni PHP che stavo usando. Nel cercare suggerimenti su come risolvere questo problema, mi sono imbattuto in questa domanda e ora che ho scoperto una soluzione funzionante, ho voluto condividere qui i miei risultati. Altri suggerimenti che avevo trovato online che includevano la cancellazione e la reinstallazione di PECL / PEAR e persino la mia installazione di PHP non hanno risolto questo problema. Finalmente dopo qualche ulteriore ricerca e revisione del codice sorgente per PECL / PEAR ho trovato la vera causa. Speriamo che ciò che segue sarà di aiuto per gli altri:

È possibile che venga visualizzato questo errore quando si tenta di eseguire PECL se l'installazione PHP non ha XML abilitato per impostazione predefinita, ma invece il supporto XML viene solitamente caricato nell'installazione PHP tramite un modulo di estensione PHP (ciò potrebbe verificarsi se il ./configure --disable-xmlflag è stato specificato durante la creazione di PHP dalla fonte, o se hai installato PHP tramite vari gestori di pacchetti in cui quella build di PHP è configurata per caricare XML tramite un modulo di estensione).

Notare come è l'ultima riga dell'output dell'errore da PECL XML Extension not found- il motivo per cui questo errore appare è perché quando PECL tenta di usare la sua classe XMLParser.php fallisce perché non può accedere all'estensione XML (controlla il modulo XML usando extension_loaded('xml')attorno alla linea 259 del sorgente XMLParser.php) e poiché il modulo XML non è disponibile, non può analizzare i file di configurazione / impostazioni e generare tutti gli altri errori visti sopra.

Il motivo per cui si verifica questo problema è dovuto al modo in cui PECL opera. Il comando PECL stesso è solo uno script di shell, che determina innanzitutto dove è installato PHP sull'installazione del sistema, quindi chiama PHP sulla riga di comando con un numero di flag prima di fornire il percorso del file di script PHP PECL principale. Il flag di problema utilizzato dallo script della shell PECL è l' -nopzione che indica a PHP di ignorare qualsiasi php.inifile (e quindi PHP non caricherà nessuna delle estensioni aggiuntive php.inispecificate dal file, incluso in questo caso XML).

Si può vedere l'impatto del -nflag eseguendo i seguenti due comandi:

  • prima prova a correre php -msulla riga di comando
  • quindi confrontare l'output con php -n -m

Non dovresti vedere l'estensione XML elencata quando esegui il secondo comando perché il -nflag ha detto a PHP di non analizzare i nostri php.inifile.

Se esegui vi `which pecl`dalla riga di comando dovresti vedere il contenuto del comando PECL (come notato sopra, è solo uno script di shell), e se controlli l'ultima riga, vedrai qualcosa del genere:

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 "$@"

Dovresti vedere il -nflag elencato tra i flag -Ce -q. Se modifichi lo script della shell PECL, omettendo il -nflag ora dovresti essere in grado di eseguire nuovamente PECL senza problemi.

In alternativa, puoi ricompilare PHP dal sorgente assicurandoti che il modulo XML sia compilato nel binario PHP anziché essere caricato da un modulo di estensione PHP in fase di esecuzione. Ovviamente la modifica dello script della shell PECL per rimuovere il -nflag risolverà il problema solo fino a quando PECL / PEAR non verrà reinstallato, si spera tuttavia che i manutentori di PECL / PEAR possano aggiornare il loro repository con questa correzione. Garantire che PHP sia costruito con il supporto XML compilato, è comunque una soluzione a lungo termine alla soluzione, ma potrebbe non essere l'ideale per le circostanze di tutti.

Per completezza, se esegui vi `which pear`vedrai uno script di shell molto simile a quello utilizzato da PECL, tuttavia il -nflag che manca al comando che chiama PHP e come tale il comando PEAR non è soggetto agli stessi problemi.


5
Risposta epica, la modifica della sceneggiatura ha funzionato per me.
Alex Ross,

29
Signore ... sei un santo. ... ... letteralmente. Scriverò una sceneggiatura che scruta i necrologi di ogni giornale e non appena morirai, dirò al Vaticano di iniziare il processo di beatificazione, usando questa risposta come esempio delle tue azioni sulla terra. Risposta eccezionale :)
riwalk

5
Grazie. TLDR; modificare l'ultima riga di /usr/bin/peclper non utilizzare il parametro -n.
dtbarne,

7
Eseguised -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer

6
Non ho -nl'ultimo comando di pecle purtroppo la lunga lista di errori
whiteletters in blankpapers

29

Ho appena affrontato questo problema su Ubuntu quando ho chiamato il comando PECL. L'unica cosa che mi ha aiutato è installare il php-xmlpacchetto. Prima controlla se hai già installato il modulo XML

php -m

Se non lo trovi, devi farlo

sudo apt-get install php-pear

installerà automaticamente il pacchetto php-xml. o puoi semplicemente installare xml in questo modo (a seconda della versione di php che hai)

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

Se trovi xml, devi rimuoverlo e reinstallarlo

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

Se hai RPM come gestore di pacchetti puoi usare yum install php-xmleyum remove php-xml


1
php-xml php7.0-xml sono installati ma il modulo XML non è qui
Loenix

La risposta brillante mi ha aiutato
Syed Aqeel,

8

Sto usando php5.6.

Molte risposte raccomandano di installare php-xml, ma non funziona per me, quando scrivo una versione specifica come

sudo apt-get install php5.6-xml

e tutto funziona, forse aiuterà gli altri.


funziona per php 5.6
devst3r

Ha funzionato per me in php 7.2, Ubuntu 16.04. Il mio comando è stato: sudo apt install php7.2-xml. Puoi aggiornare la risposta per includere anche il mio comando se vuoi :) grazie
voghDev

4

devi installare il pacchetto php-xml per correggere il problema "Estensione XML non trovata"


2
Una spiegazione in più potrebbe essere utile qui.
Kasperd,

Questa domanda ha quasi 2 anni. Cerca di evitare di rispondere alle vecchie domande mentre ingombra la schermata principale.
Catherine MacInnes,

1
Il motivo per cui ho risposto è che ho riscontrato questo problema oggi e questa soluzione ha risolto il mio problema!
Kavehmb,

questa è l'unica cosa che dovevamo fare, poiché sto usando php7.2e non ho modificato alcun file appena installato la mia versione relativa usando il comandosudo apt-get install php7.2-xml
Muhammad Omer Aslam,

2

Rimuovere completamente gli RPM PEAR, rm -rf /usr/share/pear/quindi installare nuovamente pear e tutti i moduli.


Seguito da quello yum erase php-peare ora tutto va bene! Grazie! :)
eComEvo,

1
Si noti che durante la reinstallazione utilizzare la versione php54w di php pear (anziché il pacchetto php-pear stock). Quindi in breve 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Attila Fulop,

2

I seguenti passaggi funzionano per me.

1 passaggio:

yum erase php-pear

2 passaggi:

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

 yum install --enablerepo=remi --enablerepo=remi-php56 php-pear

0

PHP7 / persone Debian (simile / stesso motivo):

La ragione di ciò, è, come detto sopra, l'estensione XML mancante. Da parte nostra useremo dotdeb e l'XML è stato rimosso dal build-in per essere un pacchetto separato:

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

Nota anche che bcmatch, dba, mbstring, soap, xml e zip ora hanno i loro pacchetti dedicati separati.

Ciò significa che

php -n

non includerà più xml, da cui dipende il parser del pacchetto PEAR (XML parser). Fonte pear.php.net/package/PEAR/download

Estensione PHP: xml

Dal momento che è fondamentale per pecl non usare php.ini del sistema, per garantire la funzionalità in tutti i casi (anche se la disfunzionalità è il motivo per cui si esegue pecl ..) non cambierà usando -n .. piuttosto i ragazzi dotdeb hanno bisogno smettere finalmente di riconfezionare, ristrutturare e spostare i pacchetti circostanti senza nemmeno provarlo leggermente.

C'è anche un problema con il pacchetto PEAR spedito, che deve essere aggiornato con ... non è consentito pubblicare nient'altro a causa della reputazione attuale

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.