hipotetyczne pytanie do was wszystkich do gryzienia ...Dlaczego funkcja nieskończenie rekursywna w PHP powoduje błąd segfault?
Niedawno odpowiedział na jedno pytanie SO gdzie skrypt PHP został segfaulting, i przypomniało mi coś Zawsze zastanawiałem się, więc zobaczymy, czy ktoś może rzucić jakiekolwiek światło na nim.
rozważyć następujące:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
Oczywiście, funkcja (bezużyteczne) pętli w nieskończoność. W końcu zabraknie pamięci, ponieważ każde wywołanie funkcji zostanie wykonane przed zakończeniem poprzedniej. Coś w rodzaju bomby widłowej bez rozwidlenia.
Ale ... w końcu, na platformach POSIX, skrypt umrze z SIGSEGV (to również umiera w Windowsie, ale z większą wdziękiem - o ile moje ekstremalnie ograniczone umiejętności debugowania na niskim poziomie mogą powiedzieć). Liczba pętli różni się w zależności od konfiguracji systemu (pamięć przydzielona do PHP, 32bit/64bit itd.) I systemu operacyjnego, ale moim prawdziwym pytaniem jest: dlaczego tak się dzieje z segfaultem?
- Czy w ten sposób PHP radzi sobie z błędami "braku pamięci"? Z pewnością musi być bardziej zgrabny sposób radzenia sobie z tym?
- Czy to błąd w silniku Zend?
- Czy jest jakiś sposób, że można to kontrolować lub obsługiwać z wdziękiem za pomocą skryptu PHP?
- Czy istnieje ustawienie, które ogólnie kontroluje maksymalną liczbę wywołań rekursywnych, które można wprowadzić w funkcji?
Współczesne wersje php (5 iirc) mają ograniczoną głębokość rekurencji, aby temu zapobiec. rodzaj rzeczy. Jeśli jest to segfault, to jest to z pewnością błąd, który powinien być zgłoszony ... – ircmaxell
[Według PHP] (https://bugs.php.net/bug.php?id=43187), jest to zamierzone zachowanie. – NullUserException
Jeśli szukasz języka, który ma limit rekursji, spróbuj [Python] (http://docs.python.org/library/sys.html#sys.setrecursionlimit) – NullUserException