为什么PHP中的无限递归函数会导致隔离故障?
一个假设的问题,让你们所有人都咀嚼...
我最近回答了另一个关于SO的问题,其中PHP脚本正在隔离,它让我想起了我一直想知道的事情,所以让我们看看是否有人能对此有所了解。
请考虑以下事项:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
显然,这个(无用的)函数无限循环。最终,将耗尽内存,因为对函数的每次调用都会在前一个调用完成之前执行。有点像没有分叉的叉子炸弹。
但。。。最终,在POSIX平台上,脚本将与SIGSEGV一起死亡(它也在Windows上死亡,但更优雅 - 就我极其有限的低级调试技能而言)。循环的数量取决于系统配置(分配给PHP,32位/ 64位等的内存)和操作系统,但我真正的问题是 - 为什么会发生在segfault上?
- 这是否只是PHP处理“内存不足”错误的方式?当然,一定有一种更优雅的方式来处理这个问题吗?
- 这是Zend引擎中的错误吗?
- 有没有办法从PHP脚本中更优雅地控制或处理它?
- 是否有任何设置通常控制函数中可以进行的最大递归调用数?