Perintah PECL menghasilkan daftar panjang kesalahan

47

Saat ini menjalankan PHP 5.4 pada CentOS 6.5.

Saya menginstal paket php55w webtatic kemudian menginstal PEAR + PECL tanpa masalah bersama dengan redis dan mongo melalui PECL.

Tidak lama kemudian, saya menyadari bahwa 5.5 tidak kompatibel dengan kerangka kerja yang saya gunakan sehingga saya dapat menghapus php55w dan menginstal php54w di tempatnya.

Sekarang perintah pecl tidak bekerja sama sekali. Itu hanya menghasilkan string kesalahan yang sangat panjang ini setiap kali saya mengeluarkan perintah pecl (disingkat ... paling sering diulang puluhan kali):

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

Bagaimana saya bisa memperbaikinya?

eComEvo
sumber

Jawaban:

91

Saya menemukan kesalahan ini setelah memperbarui instalasi PHP saya ke 5.5.14, pada RedHat EL v6. Saya telah menginstal PHP melalui manajer paket Yum, dan kemudian perlu menginstal ulang beberapa ekstensi PHP yang saya gunakan. Dalam mencari kiat tentang cara mengatasi masalah ini, saya menemukan pertanyaan ini, dan sekarang setelah saya menemukan solusi yang berfungsi, saya ingin membagikan temuan saya di sini. Saran lain yang saya temukan online termasuk menghapus dan menginstal ulang PECL / PEAR dan bahkan instalasi PHP saya tidak menyelesaikan masalah ini. Akhirnya setelah beberapa penelitian lebih lanjut dan meninjau kode sumber untuk PECL / PEAR saya menemukan penyebab sebenarnya. Semoga yang berikut ini dapat membantu orang lain:

Anda mungkin melihat kesalahan ini ketika mencoba menjalankan PECL jika instalasi PHP Anda tidak memiliki XML yang diaktifkan secara default, tetapi sebaliknya dukungan XML biasanya dimuat ke dalam instalasi PHP Anda melalui modul ekstensi PHP (ini bisa terjadi jika ./configure --disable-xmlbendera ditentukan ketika membangun PHP dari sumber, atau jika Anda menginstal PHP melalui berbagai manajer paket tempat build PHP dikonfigurasikan untuk memuat XML melalui modul ekstensi).

Perhatikan bagaimana baris terakhir dari output kesalahan dari PECL adalah XML Extension not found- alasan kesalahan ini muncul adalah karena ketika PECL mencoba menggunakan kelas XMLParser.php-nya gagal karena tidak dapat mengakses ekstensi XML (memeriksa modul XML menggunakan extension_loaded('xml')sekitar baris 259 dari sumber XMLParser.php), dan karena modul XML tidak tersedia, ia tidak dapat mengurai file konfigurasi / pengaturannya dan menampilkan semua kesalahan lain yang terlihat di atas.

Alasan masalah ini terjadi adalah karena cara PECL beroperasi. Perintah PECL itu sendiri hanyalah skrip shell, yang pertama kali bekerja di mana PHP diinstal pada instalasi sistem Anda, dan kemudian memanggil PHP pada baris perintah dengan sejumlah flag sebelum memberikan path ke file skrip PHP PECL utama. Bendera masalah yang digunakan skrip shell PECL adalah -nopsi, yang memberi tahu PHP untuk mengabaikan php.inifile apa pun (dan karenanya PHP tidak akan memuat ekstensi tambahan apa pun yang php.iniditentukan file Anda , termasuk dalam hal ini XML).

Orang dapat melihat dampak dari -nbendera dengan menjalankan dua perintah berikut:

  • pertama coba jalankan php -mdi baris perintah
  • kemudian bandingkan hasilnya php -n -m

Anda seharusnya tidak melihat ekstensi XML terdaftar ketika Anda menjalankan perintah kedua karena -nbendera memberitahu PHP untuk tidak mem-parsing php.inifile kami .

Jika Anda menjalankan vi `which pecl`pada baris perintah Anda akan melihat isi dari perintah PECL (seperti yang disebutkan di atas, itu hanya skrip shell), dan jika Anda memeriksa baris terakhir, Anda akan melihat sesuatu seperti ini:

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

Anda harus melihat -nbendera yang tercantum antara -Cdan -q. Jika Anda mengedit skrip shell PECL, menghilangkan -nbendera yang sekarang Anda dapat menjalankan PECL lagi tanpa masalah.

Sebagai alternatif, Anda dapat mengkompilasi ulang PHP dari sumber untuk memastikan bahwa modul XML dikompilasi ke dalam biner PHP alih-alih dimuat dari modul ekstensi PHP saat run-time. Jelas mengedit skrip shell PECL untuk menghapus -nbendera hanya akan memperbaiki masalah sampai PECL / PEAR diinstal ulang, mudah-mudahan bagaimanapun pengelola PECL / PEAR dapat memperbarui repo mereka dengan perbaikan ini. Memastikan PHP dibangun dengan dukungan XML yang dikompilasi, bagaimanapun juga merupakan solusi jangka panjang untuk solusi ini, tetapi mungkin tidak ideal untuk keadaan semua orang.

Hanya untuk kelengkapan, jika Anda menjalankan vi `which pear`Anda akan melihat skrip shell yang sangat mirip dengan yang digunakan PECL, namun -nflag tersebut hilang dari perintah yang memanggil PHP dan karenanya perintah PEAR tidak mengalami masalah yang sama.

bluebinary
sumber
5
Jawaban epik, mengedit skrip pecl bekerja untuk saya.
Alex Ross
29
Anda Tuan ... adalah orang suci. ... ... secara harfiah. Saya akan menulis naskah yang memindai berita kematian dari setiap surat kabar, dan segera setelah Anda meninggal, saya akan memberi tahu Vatikan untuk memulai proses beatifikasi, menggunakan jawaban ini sebagai contoh tindakan Anda di bumi. Jawaban yang luar biasa :)
riwalk
5
Terima kasih. TLDR; edit baris terakhir /usr/bin/pecluntuk tidak menggunakan parameter -n.
dtbarne
7
Jalankansed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer
6
Saya tidak memiliki -nperintah terakhir pecldan daftar panjang kesalahan tetap sayangnya
surat putih dalam blankpaper
29

Saya baru saja menghadapi masalah ini di ubuntu ketika saya memanggil perintah PECL. Satu-satunya hal yang membantu saya adalah menginstal php-xmlpaket. Pertama periksa apakah Anda sudah menginstal modul XML

php -m

Jika Anda tidak menemukannya maka Anda harus melakukannya

sudo apt-get install php-pear

itu akan secara otomatis menginstal paket php-xml. atau Anda dapat menginstal xml seperti ini (tergantung pada versi php yang Anda miliki)

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

Jika Anda menemukan xml maka Anda harus menghapusnya dan menginstalnya kembali

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

Jika Anda memiliki RPM sebagai pengelola paket, Anda dapat menggunakan yum install php-xmldanyum remove php-xml

Taha EL BOUFFI
sumber
1
php-xml php7.0-xml diinstal tetapi modul XML tidak ada di sini
Loenix
Jawaban yang brilian itu membantu saya
Syed Aqeel
8

Saya menggunakan php5.6.

Banyak jawaban menyarankan untuk menginstal php-xml, tetapi tidak berfungsi untuk saya, ketika saya mengetik versi tertentu suka

sudo apt-get install php5.6-xml

dan semuanya berfungsi, mungkin itu akan membantu orang lain.

Hafiz Al Farisyi
sumber
berfungsi untuk php 5.6
devst3r
Bekerja untuk saya di php 7.2, Ubuntu 16.04. Perintah saya adalah: sudo apt install php7.2-xml. Anda dapat memperbarui jawabannya dengan menyertakan perintah saya jika Anda mau :) terima kasih
voghDev
4

Anda harus menginstal paket php-xml untuk memperbaiki masalah "Ekstensi XML tidak ditemukan"

kavehmb
sumber
2
Penjelasan lebih sedikit bisa berguna di sini.
kasperd
Harap dicatat bahwa pertanyaan ini hampir berumur 2 tahun. Cobalah untuk menghindari menjawab pertanyaan lama karena mengacaukan layar beranda.
Catherine MacInnes
1
Alasan saya menjawabnya adalah karena saya mengalami masalah ini hari ini dan solusi ini menyelesaikan masalah saya!
kavehmb
ini adalah satu-satunya hal yang harus kami lakukan, karena saya menggunakan php7.2dan saya tidak mengedit file yang baru saja menginstal versi relatif saya menggunakan perintahsudo apt-get install php7.2-xml
Muhammad Omer Aslam
2

Hapus semua PEAR RPM sepenuhnya, rm -rf /usr/share/pear/lalu instal pir lagi dan semua modul Anda.

Florin Asăvoaie
sumber
Diikuti dengan itu yum erase php-peardan sekarang semuanya baik-baik saja! Terima kasih! :)
eComEvo
1
Harap dicatat menggunakan versi php pear php54w saat menginstal ulang (bukan paket php-pear stok). Singkatnya 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
Attila Fulop
2

Langkah-langkah berikut ini berhasil untuk saya.

1 langkah:

yum erase php-pear

2 langkah:

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

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

PHP7 / Orang Debian (alasan serupa / sama):

Alasan untuk itu, adalah, bagaimana disebutkan di atas, ekstensi XML yang hilang. Sebagian dari kita harus menggunakan dotdeb , dan xml yang dihapus dari build-in menjadi paket terpisah:

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

Harap perhatikan juga bahwa bcmatch, dba, mbstring, sabun, xml , dan zip sekarang memiliki paket khusus tersendiri.

Ini artinya, itu

php -n

tidak akan lagi menyertakan xml, yang tergantung pada pengurai paket PEAR (XML parser). Sumber pear.php.net/package/PEAR/download

Ekstensi PHP: xml

Karena sangat penting bagi pecl untuk tidak menggunakan php.ini dari sistem, untuk menjamin fungsionalitas dalam semua kasus (bahkan jika disfungsionalitas adalah alasan Anda menjalankan pecl ..) itu tidak akan berubah menggunakan -n .. bukan yang dibutuhkan pria dotdeb untuk akhirnya berhenti mengemas ulang, merestrukturisasi dan menggeser paket-paket diseluruh tanpa sedikit pun mengujinya.

Ada juga masalah dengan paket PEAR yang dikirim, yang perlu ditingkatkan dengan ... tidak diizinkan memposting hal lain karena reputasi saat ini

Eugen Mayer
sumber