PHP不处理堆栈溢出?

时间:2009-11-23 12:27:20

标签: php crash segmentation-fault stack-overflow

当我尝试以下PHP代码时,我感到很惊讶:

function foo()
{
    foo();
}
foo();

我希望得到“500:内部服务器错误”。而是立即关闭连接(没有收到字节),日志文件显示apache已分段。 WTF?这是PHP中的已知错误吗?是否有一些我缺少的配置选项?因为每次意外堆栈溢出的崩溃过程都是......我认为是非常不可接受的。

4 个答案:

答案 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)

取自iBlog - Ilia Alshanetsky

  

堆栈溢出。 PHP没有   内部堆栈保护选择   没有任何依赖系统堆栈   保护。这意味着,如果你   有一个递归函数或方法   PHP最终会崩溃。

function a() { a(); } a();
     

这个问题有两个解决方案,   1避免使用递归函数   无论如何,这通常是一个坏主意,并且   如果你必须使用它们实现一些   使用全局变量的计数器   会妨碍这个功能   迭代自己超过X量   X值在500到500之间的时间   1000.另一个解决方案涉及使用xdebug扩展   实现对堆栈的保护   通过定义如何限制来溢出   深度可以递归函数通过   php.ini值。这是更好的   在托管环境中的解决方案   你无法控制脚本   正在服务器上运行。

答案 3 :(得分:0)

我认为这是一个已知的错误。请参阅列表Top 10 ways to crash PHP