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-xml
bendera 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 -n
opsi, yang memberi tahu PHP untuk mengabaikan php.ini
file apa pun (dan karenanya PHP tidak akan memuat ekstensi tambahan apa pun yang php.ini
ditentukan file Anda , termasuk dalam hal ini XML).
Orang dapat melihat dampak dari -n
bendera dengan menjalankan dua perintah berikut:
- pertama coba jalankan
php -m
di baris perintah
- kemudian bandingkan hasilnya
php -n -m
Anda seharusnya tidak melihat ekstensi XML terdaftar ketika Anda menjalankan perintah kedua karena -n
bendera memberitahu PHP untuk tidak mem-parsing php.ini
file 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 -n
bendera yang tercantum antara -C
dan -q
. Jika Anda mengedit skrip shell PECL, menghilangkan -n
bendera 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 -n
bendera 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 -n
flag tersebut hilang dari perintah yang memanggil PHP dan karenanya perintah PEAR tidak mengalami masalah yang sama.