pptv破解版2013無限制 PHP中的函數嵌套層數限制分析

WBOY
發布: 2016-07-29 08:45:32
原創
1056 人瀏覽過

函數嵌套,這個名字有點糾結,也許不太好理解。一個比較常見的函數巢狀特例:遞歸函數,即函數自己嵌套自己。 一直以為PHP不能有太多的函數嵌套,這是因為在以前某些時候不小心用到了遞歸,在遞歸的深度達到100時, 即函數嵌套的層數達到100時,程式會報一個Fatal error。如下範例:

複製程式碼 程式碼如下:


function rt() {
static $i;
function rt() {
static $i;
function rt() {
static $i;
function rt() {
static $i; echo $i++, '
';

rt();
}
rt();
die();

在我的win7 + php5.3的環境下報錯誤如下: Fatal error:Maximum function nesting level of '100′ reached, aborting! 一直以為是PHP本身的限制,直到某一天切換到liunx環境下以命令列的模式運行,發現,程式限入了死循環。 不同的環境下有不同的結果,為什麼呢?好吧,我們直接在原始碼中查找報錯訊息,發現沒有相關內容,直接debug整個執行過程,也沒有在win下的報錯。 什麼原因?再次切換到win下,再次查找,發現在xdebug中看到了報錯訊息。在xdebug.c檔案的1242行開始:


複製程式碼

程式碼如下:


XG(level)++; 🎜>if (XG(level) == XG(max_nesting_level)) {

php_error(E_ERROR, "Maximum function nesting level of '%ld' reached,
aborting!", XG(max_nesting_level)); >}

這表示什麼?之前的函數巢狀的層數限制是xdebug擴充加上的,為什麼會有這個限制了呢?在xdebug中,xdebug中會記錄每次函數調用, 包括嵌套的函數調用,函​​數調用中的內存,時間等值,這些值在分析程序性能時有大用。如果沒有這個限制,當嵌套的層數太多,機器就會記憶體耗盡。 如果這是一台生產環境的伺服器,那麼就會有部分服務不可用,當然生產環境下是不會增加這個擴充的。但是在多人共用的開發伺服器上就可能有這個擴展, 如果因為一個開發人員的程式錯誤導致機器不可用,從而使所有的開發人員不能工作,我想這也許是添加限制的原因吧。

如果我們需要把這個限制的層數加大,怎麼辦呢?改源碼,重新編譯xdebug擴充?不需要,在xdebug的配置項中有一項叫做xdebug.max_nesting_level, 預設情況下,在php.ini中這個配置項是被註解了的,去掉註釋,將這個值成你所需要的值,200?不夠,那500吧,但是這個值還是不要太大, 如果遞歸太多,對程式的效能有很大的影響,此時,以棧的形式實現遞歸或者用循環替換遞歸會是一個更好的方案, 如:斐波那契數列(Fibonacci)的實現,用循環來實現會更快。

結論:PHP本身的函數巢狀是沒有限制的,如果說有限制,也是記憶體的限制。這是因為PHP的函數巢狀是以堆疊的形式實現的。對於每個函數都會分配一段記憶體來儲存函數局部的內容。

以上就介紹了pptv破解版2013無限制 PHP中的函數嵌套層數限制分析,包括了pptv破解版2013無限制方面的內容,希望對PHP教程有興趣的朋友有所幫助。
相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板