PHP 不处理堆栈溢出?

发布于 2024-08-12 03:32:09 字数 229 浏览 6 评论 0原文

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

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

我预计会收到“500:内部服务器错误”。相反,连接立即关闭(没有收到字节),并且日志文件显示 apache 出现段错误。搞什么?这是 PHP 中的已知错误吗?我缺少一些配置选项吗?因为每次意外的堆栈溢出都会导致进程崩溃,嗯……我认为这是非常不可接受的。

I was surprised when I just tried the following PHP code:

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

I expected to get "500: Internal server error". Instead the connection was closed immediately (no bytes received), and the log files show that apache segfaulted. WTF? Is this a known bug in PHP? Are there some configuration options that I'm missing? Because a crashed process for every accidental stack overflow is, well... pretty unacceptable, I think.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

挽你眉间 2024-08-19 03:32:10

PHP 无法处理这个问题,它只会进入无限循环并产生分段错误。

http://bugs.php.net/bug.php?id=49823

还有

http://www.mail-archive。 com/[电子邮件受保护]/msg128905.html

PHP is not able to deal with this, it will just go into an infinite loop and produce a segmentation fault.

http://bugs.php.net/bug.php?id=49823

also

http://www.mail-archive.com/[email protected]/msg128905.html

我不咬妳我踢妳 2024-08-19 03:32:10

避免使用递归函数,它们通常是一个坏主意” 0 riiight:))) 发明它们是因为它是一个坏主意:))...

我建议为调用函数的次数设置一个 hrd 上限。 DO不要使用全局变量(您实际上可能需要调用更多递归函数,为什么会像这样污染全局变量?)。您可以为函数使用额外的参数。

function a($param1, $param2, $depth=100){
  $depth--;
  if(!$depth==0) return error
}

avoid using recursive functions they are generally a bad idea" 0 riiight:))) they were invented because its a bad ideea:))...

I recomment setting a hrd upper-limit on the number of times the functions is called. DO NOT use global variables (you may actually need to call more recursive functions, why pollute the globals like this?). You may use extra parameters for a function

function a($param1, $param2, $depth=100){
  $depth--;
  if(!$depth==0) return error
}
好倦 2024-08-19 03:32:10

摘自iBlog - Ilia Alshanetsky

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

函数 a() { a(); } a();

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

Taken from iBlog - Ilia Alshanetsky

Stack overflow. PHP does not have any
internal stack protection choosing to
rely upon the system stack without any
protection. This means that if you
have a recursive function or a method
PHP will eventually crash.

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

There are 2 solutions to this problem,
1 avoid using recursive functions they
are generally a bad idea anyway, and
if you MUST use them implement some
counter using a global variable that
would prevent the function from
iterating itself more then X amount of
time for values of X between 500 to
1000. The other solution involves using the xdebug extension that
implements protection against stack
overflows by defining a limit on how
deep can recursive functions go via a
php.ini value. This is a better
solution in hosting environments where
you have no control over the scripts
that are being ran on the server.

森末i 2024-08-19 03:32:10

我认为这是一个已知的错误。请参阅列表导致 PHP 崩溃的 10 种方法

I think this is a known bug. See the list Top 10 ways to crash PHP.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文