私は最近、PHPスクリプトがセグメンテーションフォルトたSO場所に別の質問に答え、それは私がいつも疑問に思っている何かを思い出させてくれましたので、誰でも当てることができるかどうかを見てみましょうPHPで無限再帰関数がsegfaultを引き起こすのはなぜですか?
あなたに噛むためにすべてのための仮定の質問...その上の光。
は、次の点を考慮
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
明らかに、この(役に立たない)関数が無限ループします。最終的には、前の関数が終了する前に関数の各呼び出しが実行されるため、メモリが不足します。フォークのないフォーク爆弾のようなもの。
しかし最終的には、POSIXプラットフォームでは、スクリプトはSIGSEGVで消滅します(これはWindowsでも死亡しますが、より上品に - 非常に限られた低レベルのデバッグスキルが示す限り)。ループの数は、システム構成(PHP、32ビット/ 64ビットなどに割り当てられたメモリ)やOSによって異なりますが、私の本当の疑問は、なぜセグメンテーションで起こるのでしょうか?
- これはPHPが「メモリ不足」エラーを処理する方法ですか?確かにこれを処理するより優雅な方法が必要でしょうか?
- これはZendエンジンのバグですか?
- これは、PHPスクリプト内からより適切に制御または処理できる方法はありますか?
- 関数内で実行できる再帰呼び出しの最大数を一般的に制御する設定はありますか?
現バージョンのphp(5 iirc)はこれを防ぐために再帰に深さ制限がありますものの種類。 segfaultingの場合は、間違いなく報告すべきバグです... – ircmaxell
[PHPによる](https://bugs.php.net/bug.php?id=43187)、これは意図した動作です。 – NullUserException
再帰制限を持つ言語を探している場合は、[Python](http://docs.python.org/library/sys.html#sys.setrecursionlimit)を試してください。 – NullUserException