เพิ่มขีด จำกัด การเรียกฟังก์ชันการซ้อนกัน


128

มีขีด จำกัด ที่ไม่ดีอย่างหนึ่งใน PHP: หากคุณเรียกใช้ฟังก์ชัน a1 () ที่เรียก a2 () ซึ่งเรียกใช้ a3 ... ดังนั้นเมื่อคุณจะa99()โทรa100()คุณจะเห็น

ข้อผิดพลาดร้ายแรง: ฟังก์ชันการซ้อนสูงสุดถึงระดับ '100' ยกเลิก!

มีวิธีใดบ้างที่จะเพิ่มขีด จำกัด ของการโทร 100 รังเป็น 500 หรือ 10,000?

นี่เป็นสิ่งสำคัญสำหรับฉันเพราะฉันกำลังพัฒนาระบบตามเหตุการณ์ที่มีการโทรกลับจำนวนมาก


12
100 ดูเหมือนจะมากเกินไปเล็กน้อยแม้กระทั่งสำหรับกรอบเหตุการณ์
Ignacio Vazquez-Abrams

7
@Ignacio: มันค่อนข้างง่ายแม้ว่าโฟกัสจะอยู่ที่เฟรมเวิร์กเหตุการณ์ แต่ก็มีฟังก์ชันวนซ้ำที่ต้องการระดับการซ้อนที่สูงขึ้นมาก หลายหมื่น (หรือหลายล้าน) ไม่ใช่เรื่องแปลกในสถานการณ์เช่นนี้
Abel

stackoverflow.com/a/36440027/2652524ฉันแก้ปัญหาของฉันโดยใช้คำตอบนี้
คุชราตซานตาน่า

คำตอบ:


255

ข้อความแสดงข้อผิดพลาดนี้มาจากส่วนขยาย XDebug โดยเฉพาะ PHP เองไม่มีขีด จำกัด การซ้อนฟังก์ชัน เปลี่ยนการตั้งค่าใน php.ini ของคุณ:

xdebug.max_nesting_level = 200

หรือในโค้ด PHP ของคุณ:

ini_set('xdebug.max_nesting_level', 200);

สำหรับถ้าคุณจำเป็นต้องเปลี่ยนจริงๆ (เช่น: ถ้ามีทางเลือกอื่นสำหรับฟังก์ชันการเรียกซ้ำ) ฉันไม่สามารถบอกได้หากไม่มีรหัส


ผมมีปัญหาเหมือนกัน. max_nesting_level ของฉันถูกตั้งค่าเป็น 100 แต่ในกรณีของฉันในบางกรณีอาจมีการโทรซ้ำ 1,000 ครั้ง ดังนั้นฉันจึงตั้งค่าเป็น 10,000 เพื่อหลีกเลี่ยงข้อผิดพลาด xdebug นี้ ในทุกกรณีจะดีกว่าให้ PHP โดยไม่มีขีด จำกัด เสมอ
SkaJess

9
หากคุณไม่มีxdebug.max_nesting_level = 100ตัวเลือกนี้ในphp.iniของคุณเพียงแค่วางมันลง
M. Reza Nasirloo

@Pedram วิธีที่ถูกต้องในการคัดลอกในไฟล์ php ini คือใน /etc/php5/apache2/conf.d/20-xdebug.ini ไม่ใช่ใน php.ini ปกติ เป็นเพียงแนวทางปฏิบัติที่ดี
Enrique Quero

3
@EnriqueQuero ขึ้นอยู่กับระบบและ OS
netcoder

มันได้ผล! ไม่ว่าคุณจะใช้ XDebug หรือไม่ก็ตามถ้าคุณไม่แสดงความคิดเห็นใน php.ini ฉันใช้อย่างชัดเจน: ini_set ('xdebug.max_nesting_level', -1);
user2928048

13

คุณได้ติดตั้ง Zend, IonCube หรือ xDebug หรือไม่ ถ้าเป็นเช่นนั้นนั่นอาจเป็นจุดที่คุณได้รับข้อผิดพลาดนี้

เมื่อสองสามปีก่อนฉันเจอเรื่องนี้และมันก็จบลงด้วยการที่ Zend วางขีด จำกัด นั้นไว้ที่นั่นไม่ใช่ PHP แน่นอนว่าการลบออกจะทำให้คุณผ่านการทำซ้ำ 100 ครั้ง แต่ในที่สุดคุณก็จะถึงขีด จำกัด หน่วยความจำ


1

โดยส่วนตัวแล้วฉันขอแนะนำว่านี่เป็นข้อผิดพลาดเมื่อเทียบกับการตั้งค่าที่ต้องปรับเปลี่ยน ในรหัสของฉันเป็นเพราะฉันมีคลาสที่มีชื่อเดียวกันกับไลบรารีภายในหนึ่งในคอนโทรลเลอร์ของฉันและดูเหมือนว่าจะเดินทางขึ้น

ข้อผิดพลาดของเอาต์พุตและดูว่าสิ่งนี้ถูกทริกเกอร์ที่ใด

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