ฉันพบข้อผิดพลาดหลังจากอัปเดตการติดตั้ง PHP เป็น 5.5.14 บน RedHat EL v6 ฉันได้ติดตั้ง PHP ผ่านผู้จัดการแพคเกจยำแล้วจำเป็นต้องติดตั้งส่วนขยาย PHP บางส่วนที่ฉันใช้อีกครั้ง ในการค้นหาเคล็ดลับเกี่ยวกับวิธีการแก้ไขปัญหานี้ฉันได้พบกับคำถามนี้และตอนนี้ฉันได้ค้นพบวิธีแก้ปัญหาการทำงานที่ฉันต้องการแบ่งปันสิ่งที่ค้นพบที่นี่ คำแนะนำอื่น ๆ ที่ฉันพบทางออนไลน์ซึ่งรวมถึงการลบและติดตั้ง PECL / PEAR อีกครั้งและแม้แต่การติดตั้ง PHP ของฉันก็ไม่สามารถแก้ไขปัญหานี้ได้ ในที่สุดหลังจากการวิจัยเพิ่มเติมและการตรวจสอบซอร์สโค้ดสำหรับ PECL / ลูกแพร์ฉันพบสาเหตุที่แท้จริง หวังว่าสิ่งต่อไปนี้จะเป็นประโยชน์ต่อผู้อื่น:
คุณอาจเห็นข้อผิดพลาดนี้เมื่อพยายามเรียกใช้ PECL หากการติดตั้ง PHP ของคุณไม่ได้เปิดใช้งาน XML ตามค่าเริ่มต้น แต่โดยปกติแล้วการรองรับ XML จะถูกโหลดลงในการติดตั้ง PHP ของคุณผ่านโมดูลส่วนขยาย PHP (ซึ่งอาจเกิดขึ้น./configure --disable-xml
ได้ จากซอร์สหรือถ้าคุณติดตั้ง PHP ผ่านตัวจัดการแพกเกจต่าง ๆ ที่สร้างของ PHP นั้นถูกกำหนดค่าให้โหลด XML ผ่านโมดูลส่วนขยาย)
โปรดสังเกตว่าบรรทัดสุดท้ายของเอาต์พุตข้อผิดพลาดจาก PECL คืออะไรXML Extension not found
- สาเหตุของข้อผิดพลาดนี้ปรากฏขึ้นเนื่องจากเมื่อ PECL พยายามใช้คลาส XMLParser.php ของมันล้มเหลวเนื่องจากไม่สามารถเข้าถึงส่วนขยาย XML (ตรวจสอบโมดูล XML ที่ใช้extension_loaded('xml')
รอบบรรทัด) 259 ของแหล่ง XMLParser.php) และเนื่องจากโมดูล XML ไม่พร้อมใช้งานจึงไม่สามารถแยกวิเคราะห์ไฟล์การตั้งค่า / การตั้งค่าและส่งออกข้อผิดพลาดอื่น ๆ ทั้งหมดที่เห็นด้านบน
สาเหตุที่ปัญหานี้เกิดขึ้นเนื่องจากวิธีการทำงานของ PECL คำสั่ง PECL นั้นเป็นเพียงเชลล์สคริปต์ซึ่งทำงานเป็นอันดับแรกเมื่อติดตั้ง PHP ในการติดตั้งระบบของคุณจากนั้นเรียกใช้ PHP บนบรรทัดคำสั่งด้วยจำนวนแฟล็กก่อนที่จะจัดทำพา ธ ไปยังไฟล์สคริปต์ PECL PHP หลัก การตั้งค่าสถานะปัญหาที่ใช้สคริปต์เชลล์ PECL คือ-n
ตัวเลือกซึ่งจะบอกให้ PHP ละเว้นphp.ini
ไฟล์ใด ๆ(ดังนั้น PHP จะไม่โหลดส่วนขยายเพิ่มเติมใด ๆ ที่php.ini
ไฟล์ของคุณระบุรวมถึง XML ในกรณีนี้)
หนึ่งสามารถเห็นผลกระทบของการ-n
ตั้งค่าสถานะโดยการเรียกใช้สองคำสั่งต่อไปนี้:
- ก่อนอื่นให้ลองเรียกใช้
php -m
บนบรรทัดคำสั่ง
- จากนั้นเปรียบเทียบผลลัพธ์กับ
php -n -m
คุณไม่ควรเห็นส่วนขยาย XML ที่ระบุไว้เมื่อคุณเรียกใช้คำสั่งที่สองเนื่องจากการ-n
ตั้งค่าสถานะบอก PHP ไม่ให้แยกphp.ini
ไฟล์ของเรา
หากคุณเรียกใช้vi `which pecl`
บนบรรทัดคำสั่งคุณควรเห็นเนื้อหาของคำสั่ง PECL (ดังที่ได้กล่าวไว้ข้างต้นเป็นเพียงเชลล์สคริปต์) และหากคุณตรวจสอบบรรทัดสุดท้ายคุณจะเห็นสิ่งต่อไปนี้:
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 "$@"
คุณจะเห็น-n
ธงจดทะเบียนระหว่าง-C
และ-q
ธง หากคุณแก้ไขสคริปต์เชลล์ PECL การข้าม-n
แฟล็กคุณควรจะสามารถรัน PECL ได้อีกครั้งโดยไม่มีปัญหา
อีกวิธีหนึ่งคุณสามารถคอมไพล์ PHP จากซอร์สอีกครั้งเพื่อให้แน่ใจว่าโมดูล XML นั้นถูกคอมไพล์ลงในไบนารี PHP แทนการโหลดจากโมดูลเสริม PHP ในเวลาทำงาน เห็นได้ชัดว่าการแก้ไขเชลล์สคริปต์ PECL เพื่อลบ-n
ค่าสถานะจะแก้ไขปัญหาได้จนกว่า PECL / PEAR จะได้รับการติดตั้งใหม่หวังว่าผู้ดูแลระบบของ PECL / PEAR จะสามารถอัพเดต repo ได้ด้วยการแก้ไขนี้ การสร้างความมั่นใจว่า PHP นั้นถูกสร้างขึ้นด้วยการรองรับ XML ที่คอมไพล์แล้ว แต่เป็นการแก้ไขปัญหาระยะยาว แต่อาจไม่เหมาะสำหรับทุกคน
เพื่อความสมบูรณ์ถ้าคุณเรียกใช้vi `which pear`
คุณจะเห็นเชลล์สคริปต์ที่คล้ายกันมากกับที่ใช้ใน PECL อย่างไรก็ตามการ-n
ตั้งค่าสถานะจะหายไปจากคำสั่งที่เรียกใช้ PHP และคำสั่ง PEAR นั้นไม่อยู่ภายใต้ปัญหาเดียวกันเหล่านี้