你都來啃一個假設性的問題......爲什麼PHP中的無限遞歸函數會導致段錯誤?
我最近回答了另一個問題上那麼,一個PHP腳本段錯誤,它提醒我的東西,我一直在想,讓我們看看,如果任何人都可以擺脫它上面有任何光。
考慮以下幾點:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
顯然,這(沒用)功能無限循環。並且最終將耗盡內存,因爲每次調用函數都會在前一個函數完成之前執行。有點像叉子炸彈沒有分叉。但是......最終,在POSIX平臺上,腳本將死於SIGSEGV(它也死於Windows,但更優雅 - 只要我極其有限的低級調試技能可以說明)。循環數取決於系統配置(分配給PHP,32位/ 64位等的內存等)和操作系統,但我真正的問題是 - 爲什麼會發生段錯誤?
- 這是PHP如何處理「內存不足」錯誤?當然,必須有更優雅的處理方式?
- 這是Zend引擎中的錯誤嗎?
- 有沒有什麼辦法可以從PHP腳本中更好地控制或處理這個問題?
- 是否有任何設置通常控制可以在函數中進行遞歸調用的最大數量?
現代版本的PHP(5 iirc)有遞歸的深度限制,以防止這種情況之類的事情。如果它是segfaulting,這絕對是一個應該報告的錯誤... – ircmaxell
[根據PHP](https://bugs.php.net/bug.php?id=43187),這是打算的行爲。 – NullUserException
如果您正在尋找具有遞歸限制的語言,請嘗試[Python](http://docs.python.org/library/sys.html#sys.setrecursionlimit) – NullUserException