Tăng giới hạn chức năng gọi lồng


127

Có một giới hạn rất tệ trong PHP: nếu bạn gọi một số hàm a1 () gọi a2 (), thì gọi a3 ... vì vậy khi nào a99()sẽ gọi a100()bạn sẽ thấy

Lỗi nghiêm trọng: Đạt đến mức lồng tối đa của hàm '100', hủy bỏ!

Có cách nào để tăng giới hạn của 100 cuộc gọi lồng lên 500 hoặc 10000 không?

Điều này rất quan trọng đối với tôi vì tôi đang phát triển một hệ thống dựa trên sự kiện với rất nhiều cuộc gọi lại.


12
100 có vẻ hơi quá mức, ngay cả đối với một khung sự kiện.
Ignacio Vazquez-Abrams

7
@Ignacio: khá đơn giản, ngay cả khi trọng tâm là khung sự kiện, để có chức năng đệ quy cần mức lồng cao hơn nhiều. Hàng chục ngàn (hoặc thậm chí hàng triệu) không phải là hiếm trong kịch bản như vậy.
Abel

stackoverflow.com/a/36440027/2652524 Tôi giải quyết vấn đề của mình bằng câu trả lời này
Gujarat Santana

Câu trả lời:


254

Thông báo lỗi này đặc biệt đến từ phần mở rộng XDebug. Bản thân PHP không có giới hạn lồng nhau chức năng. Thay đổi cài đặt trong php.ini của bạn:

xdebug.max_nesting_level = 200

hoặc trong mã PHP của bạn:

ini_set('xdebug.max_nesting_level', 200);

Về phần nếu bạn thực sự cần thay đổi nó (tức là: nếu có một giải pháp thay thế cho hàm đệ quy), tôi không thể nói mà không có mã.


Tôi đã từng gặp vấn đề tương tự. Max_nesting_level của tôi được đặt thành 100 nhưng trong trường hợp của tôi, trong một số trường hợp, có thể có 1000 cuộc gọi đệ quy. Vì vậy, tôi đặt thành 10000 để tránh lỗi xdebug này. Trong mọi trường hợp, nó luôn tốt hơn là để PHP không có giới hạn.
SkaJess

9
Nếu bạn không có xdebug.max_nesting_level = 100tùy chọn này trong php.ini, chỉ cần dán nó vào.
M. Reza Nasirloo

@Pedram Cách chính xác để sao chép trong tệp php ini là trong /etc/php5/apache2/conf.d/20-xdebug.ini, không phải trong php.ini thông thường. Chỉ cần thực hành tốt
Enrique Quero

3
@EnriqueQuero Phụ thuộc vào hệ thống và HĐH.
netcoder 17/2/2016

Nó hoạt động! Bất kể bạn có sử dụng XDebug hay không, nếu bạn bình luận dòng trong php.ini. Tôi đã sử dụng rõ ràng: ini_set ('xdebug.max_nesting_level', -1);
user2928048

13

Bạn đã cài đặt Zend, IonCube hoặc xDebug chưa? Nếu vậy, đó có lẽ là nơi bạn đang nhận được lỗi này.

Tôi đã gặp phải điều này một vài năm trước và cuối cùng Zend đặt giới hạn đó ở đó, không phải PHP. Tất nhiên loại bỏ nó sẽ cho phép bạn vượt qua 100 lần lặp, nhưng cuối cùng bạn sẽ đạt đến giới hạn bộ nhớ.


1

Cá nhân tôi sẽ đề nghị đây là một lỗi trái ngược với cài đặt cần điều chỉnh. Trong mã của tôi, đó là bởi vì tôi có một lớp có cùng tên với một thư viện trong một trong những bộ điều khiển của tôi và nó dường như vấp phải nó.

Lỗi đầu ra và xem nơi này đang được kích hoạt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.