4
votes

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.

4
Probably the compiler saw what you did there and thought oh boy, clever-time... leave me the hell alone...F.P
No doubt. Especially because PHP doesn't have a compiler. :pVilx-
I don't think that the crash is an optimization. On the other hand, how should PHP handle something like that more gracefully?innaM
You shouldn't expect PHP to give nice error messages when it sees something like this: lorienshaw.net/hasselhoff.htmlschnaader
Another reason not to use PHPYacoby

4 Answers

5
votes

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

2
votes

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
}
1
votes

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.

0
votes

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