Una pregunta hipotética para que todos puedan masticar que ...¿Por qué una función infinitamente recursiva en PHP causa una segfault?
recientemente respondí otra pregunta sobre el SO donde fue violación de segmento de un script PHP, y me acordé de algo que siempre he preguntado, así que vamos a ver si alguien puede arrojar cualquier luz sobre eso
considerar lo siguiente:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
Obviamente, esta función (inútil) bucles infinitamente. Y, finalmente, se quedará sin memoria porque cada llamada a la función se ejecuta antes de que la anterior haya finalizado. Algo así como una bomba de horquilla sin la bifurcación.
Pero ... finalmente, en las plataformas POSIX, la secuencia de comandos morirá con SIGSEGV (también se muere en Windows, pero con más gracia, en la medida en que mis habilidades de depuración de bajo nivel extremadamente limitadas pueden decir). El número de bucles varía según la configuración del sistema (memoria asignada a PHP, 32 bits/64 bits, etc., etc.) y el sistema operativo, pero mi verdadera pregunta es: ¿por qué ocurre con una segfault?
- ¿Es así simplemente como maneja PHP los errores de "falta de memoria"? Seguramente debe haber una manera más elegante de manejar esto?
- ¿Es esto un error en el motor Zend?
- ¿Hay alguna manera de que esto se pueda controlar o manejar con más elegancia desde un script PHP?
- ¿Hay alguna configuración que generalmente controle la cantidad máxima de llamadas recursivas que se pueden realizar en una función?
Las versiones modernas de php (5 iirc) tienen un límite de profundidad en la recursión para evitar esto Tipo de cosa. Si es segfaulting, definitivamente es un error que se debe informar ... – ircmaxell
[Según PHP] (https://bugs.php.net/bug.php?id=43187), este es el comportamiento previsto. – NullUserException
Si está buscando un idioma que tenga un límite de recursión, intente con [Python] (http://docs.python.org/library/sys.html#sys.setrecursionlimit) – NullUserException