2010-11-27 115 views
113

PHP中一個非常糟糕的上限:如果您調用一些功能A1()調用A2()調用A3 ......所以,當a99()會叫a100()你會看到增加嵌套函數調用限制

Fatal error: Maximum function nesting level of '100' reached, aborting!

有沒有辦法將100個嵌套調用的限制增加到500或10000?

這對我來說很重要,因爲我正在開發一個具有大量回調的基於事件的系統。

+10

100似乎有點過分,即使是一個事件框架。 – 2010-11-27 20:47:05

+7

@Ignacio:即使焦點放在事件框架上,它也非常簡單,只需要一個遞歸函數,它需要更高的嵌套級別。數萬(甚至數百萬)在這種情況下並不少見。 – Abel 2011-12-28 12:50:08

回答

228

此錯誤消息來自XDebug擴展。 PHP本身沒有函數嵌套限制。在php.ini更改the setting

xdebug.max_nesting_level = 200 

或在PHP代碼:

ini_set('xdebug.max_nesting_level', 200); 

至於如果你真的需要改變它(即:如果有一個替代解決方案遞歸函數) ,沒有代碼我就說不出來。

14

您是否安裝了Zend,IonCube或xDebug?如果是這樣,那可能是你從這個錯誤中得到的。

幾年前我遇到過這種情況,它最終成爲了Zend將這個限制放在那裏,而不是PHP。當然,刪除它可以讓你通過100次迭代,但最終會達到內存限制。

2

如果你使用了XDebug(與XAMPP,例如),您可以通過添加這php.ini文件中設置嵌套級(我建議把在文件的底部):

[XDebug] 
zend_extension = "C:\xampp\php\ext\php_xdebug.dll" 
; Other settings if needed 
xdebug.max_nesting_level = 500 

這將設置爲500限制,但如果需要可以更多。只有鏈接到XDebug文件php_xdebug.dll

1

我個人建議這是一個錯誤,而不是一個需要調整的設置。在我的代碼中,這是因爲我有一個類與我的控制器中的一個庫具有相同的名稱,並且它似乎將其啓動。

輸出錯誤並查看觸發的位置。