คำสั่ง PECL สร้างรายการข้อผิดพลาดแบบยาว


47

กำลังรัน PHP 5.4 บน CentOS 6.5

ฉันติดตั้งแพ็คเกจ php55w ของ webtatic จากนั้นติดตั้ง PEAR + PECL โดยไม่มีปัญหาพร้อมกับ redis และ mongo ผ่าน PECL

หลังจากนั้นไม่นานฉันก็รู้ว่า 5.5 ไม่เข้ากันกับกรอบที่ฉันทำงานด้วยดังนั้นฉันจึงลบ php55w และติดตั้ง php54w ลงไป

ตอนนี้คำสั่ง pecl ไม่ทำงานเลย มันเพิ่งสร้างสตริงข้อผิดพลาดที่ยาวมาก ๆ ทุกครั้งที่ฉันออกคำสั่ง pecl (ตัวย่อ ... ซ้ำหลายครั้งมากที่สุด):

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

ฉันจะแก้ไขสิ่งนี้ได้อย่างไร

คำตอบ:


91

ฉันพบข้อผิดพลาดหลังจากอัปเดตการติดตั้ง 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 นั้นไม่อยู่ภายใต้ปัญหาเดียวกันเหล่านี้


5
มหากาพย์คำตอบการแก้ไขสคริปต์ pecl เหมาะสำหรับฉัน
Alex Ross

29
คุณ ... เป็นนักบุญ ... ... แท้จริง ฉันจะเขียนสคริปต์ที่สแกนข่าวร้ายของหนังสือพิมพ์ทุกฉบับและทันทีที่คุณจากไปฉันจะบอกวาติกันให้เริ่มกระบวนการทำให้เป็นสุขโดยใช้คำตอบนี้เป็นตัวอย่างของการกระทำของคุณบนโลก คำตอบที่ยอดเยี่ยม :)
riwalk

5
ขอบคุณ TLDR; แก้ไขบรรทัดสุดท้ายของ/usr/bin/peclเพื่อไม่ใช้พารามิเตอร์ -n
dtbarne

7
ทำงานsed -i "$ s|\-n||g" /usr/bin/pecl
AVProgrammer

6
ฉันไม่ได้-nอยู่ในคำสั่งสุดท้ายpeclและยังมีข้อผิดพลาดจำนวนมากที่ยังคงอยู่
ในรายการที่ว่างเปล่า

29

ฉันเพิ่งประสบปัญหานี้บน Ubuntu เมื่อฉันเรียกใช้คำสั่ง PECL สิ่งเดียวที่ช่วยฉันได้คือติดตั้งphp-xmlแพ็คเกจ ก่อนอื่นให้ตรวจสอบว่าคุณมีโมดูล XML ติดตั้งอยู่แล้ว

php -m

หากคุณไม่พบมันคุณต้อง

sudo apt-get install php-pear

มันจะติดตั้งแพคเกจ php-xml โดยอัตโนมัติ หรือคุณสามารถติดตั้ง xml แบบนี้ได้ (ขึ้นอยู่กับเวอร์ชั่นของ php ที่คุณมี)

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

หากคุณพบ xml คุณจะลบมันแล้วติดตั้งใหม่

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

หากคุณมี RPM ในฐานะผู้จัดการแพ็คเกจคุณสามารถใช้yum install php-xmlและyum remove php-xml


1
php-xml มีการติดตั้ง php7.0-xml แต่โมดูล XML ไม่ได้อยู่ที่นี่
Loenix

คำตอบที่ยอดเยี่ยมมันช่วยฉัน
Syed Aqeel

8

ฉันใช้ php5.6

คำตอบมากมายแนะนำให้ติดตั้ง php-xml แต่มันไม่ทำงานสำหรับฉันเมื่อฉันพิมพ์เฉพาะรุ่นเช่น

sudo apt-get install php5.6-xml

และทุกอย่างใช้งานได้อาจช่วยคนอื่นได้


ใช้งานได้กับ php 5.6
devst3r

ทำงานให้ฉันใน php 7.2, Ubuntu 16.04 คำสั่งของฉันคือ: sudo apt install php7.2-xml. คุณสามารถอัปเดตคำตอบเพื่อรวมคำสั่งของฉันหากคุณต้องการ :) ขอบคุณ
voghDev

4

คุณต้องติดตั้งแพ็คเกจ php-xml เพื่อแก้ไขปัญหา "ไม่พบส่วนขยาย XML"


2
คำอธิบายเพิ่มเติมเล็กน้อยมีประโยชน์ที่นี่
kasperd

โปรดทราบว่าคำถามนี้อายุเกือบ 2 ปี พยายามหลีกเลี่ยงการตอบคำถามเก่า ๆ เพราะมันจะทำให้หน้าจอหลักปรากฏขึ้น
Catherine MacInnes

1
เหตุผลที่ฉันตอบกลับไปนี้คือฉันพบปัญหานี้ในวันนี้และโซลูชันนี้แก้ไขปัญหาของฉันได้!
kavehmb

นี่เป็นสิ่งเดียวที่เราต้องทำตามที่ฉันใช้php7.2และฉันไม่ได้แก้ไขไฟล์ใด ๆ ที่เพิ่งติดตั้งเวอร์ชันญาติของฉันโดยใช้คำสั่งsudo apt-get install php7.2-xml
Muhammad Omer Aslam

2

ลบลูกแพร์ RPMs ทั้งหมดจากrm -rf /usr/share/pear/นั้นติดตั้งลูกแพร์อีกครั้งและโมดูลทั้งหมดของคุณ


ติดตามด้วยyum erase php-pearและตอนนี้ทั้งหมดเป็นอย่างดี! ขอบคุณ! :)
eComEvo

1
โปรดทราบว่าใช้รุ่น php54w ของลูกแพร์ php เมื่อติดตั้งใหม่ (แทนที่จะเป็นแพคเกจ php-pear หุ้น) ดังนั้นในระยะสั้น 1. yum erase php-pear2. rm -rf /usr/share/pear/3.yum install php54w-pear
อัตติลาฟุลอป

2

ขั้นตอนต่อไปนี้ใช้ได้สำหรับฉัน

1 ขั้นตอน:

yum erase php-pear

2 ขั้นตอน:

# 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 ขั้นตอน:

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

0

คน PHP7 / Debian (คล้าย / เหตุผลเดียวกัน):

เหตุผลก็คือส่วนขยาย XML ที่ขาดหายไป เราต้องใช้dotdebและ xml ที่ลบออกจากการbuild-inเป็นแพ็คเกจแยก:

แหล่งที่มา: https://www.dotdeb.org/2016/06/24/php-7-0-8-for-jessie/

โปรดทราบว่าตอนนี้ bcmatch, dba, mbstring, สบู่, xmlและ zip มีแพ็คเกจแยกต่างหาก

ซึ่งหมายความว่า

php -n

จะไม่รวม xml อีกต่อไปซึ่งตัวแยกวิเคราะห์แพกเกจ PEAR ขึ้นอยู่กับ (ตัวแยกวิเคราะห์ XML) แหล่ง pear.php.net/package/PEAR/download

ส่วนขยาย PHP: xml

เนื่องจากเป็นสิ่งสำคัญสำหรับ pecl ที่จะไม่ใช้ php.ini ของระบบเพื่อรับประกัน functionionality ในทุกกรณี (แม้ว่าความผิดปกติคือเหตุผลที่คุณเรียกใช้ pecl .. ) มันจะไม่เปลี่ยนโดยใช้ -n .. แทนที่จะเป็น dotdeb guys ต้องการ เพื่อหยุดการทำหีบห่อใหม่ปรับโครงสร้างและเปลี่ยนบรรจุภัณฑ์โดยไม่ต้องทดสอบเลยแม้แต่น้อย

นอกจากนี้ยังมีปัญหากับแพคเกจ PEAR ที่จัดส่งซึ่งจำเป็นต้องอัปเกรดด้วย ... ไม่อนุญาตให้โพสต์สิ่งอื่นเนื่องจากชื่อเสียงในปัจจุบัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.