当我尝试以下PHP代码时,我感到很惊讶:
function foo()
{
foo();
}
foo();
我希望得到“500:内部服务器错误”。而是立即关闭连接(没有收到字节),日志文件显示apache已分段。 WTF?这是PHP中的已知错误吗?是否有一些我缺少的配置选项?因为每次意外堆栈溢出的崩溃过程都是......我认为是非常不可接受的。
答案 0 :(得分:5)
PHP无法解决这个问题,只会进入无限循环并产生分段错误。
http://bugs.php.net/bug.php?id=49823
也
http://www.mail-archive.com/php-bugs@lists.php.net/msg128905.html
答案 1 :(得分:2)
避免使用递归函数它们通常是一个坏主意“0 riiight :)))它们是因为它是一个坏的ideea而被发明的:))...
我建议在调用函数的次数上设置hrd上限。不要使用全局变量(实际上你可能需要调用更多的递归函数,为什么要像这样污染全局变量?)。您可以为函数使用额外的参数
function a($param1, $param2, $depth=100){
$depth--;
if(!$depth==0) return error
}
答案 2 :(得分:1)
堆栈溢出。 PHP没有 内部堆栈保护选择 没有任何依赖系统堆栈 保护。这意味着,如果你 有一个递归函数或方法 PHP最终会崩溃。
function a() { a(); } a();
这个问题有两个解决方案, 1避免使用递归函数 无论如何,这通常是一个坏主意,并且 如果你必须使用它们实现一些 使用全局变量的计数器 会妨碍这个功能 迭代自己超过X量 X值在500到500之间的时间 1000.另一个解决方案涉及使用xdebug扩展 实现对堆栈的保护 通过定义如何限制来溢出 深度可以递归函数通过 php.ini值。这是更好的 在托管环境中的解决方案 你无法控制脚本 正在服务器上运行。
答案 3 :(得分:0)
我认为这是一个已知的错误。请参阅列表Top 10 ways to crash PHP。