Una domanda ipotetica per tutti voi da masticare ...Perché una funzione infinitamente ricorsiva in PHP causa un segfault?
recente ho risposto un'altra domanda sul SO in cui uno script PHP è stato segfault, e mi ha ricordato di qualcosa che ho sempre chiesto, e vediamo se qualcuno può gettare qualsiasi luce su di esso.
consideri il seguente:
<?php
function segfault ($i = 1) {
echo "$i\n";
segfault($i + 1);
}
segfault();
?>
Ovviamente, questa funzione (inutile) loop infinito. E alla fine, esaurirà la memoria perché ogni chiamata alla funzione viene eseguita prima della precedente. Una specie di bomba a forcella senza il biforcarsi.
Ma ... alla fine, su piattaforme POSIX, lo script morirà con SIGSEGV (anch'esso muore su Windows, ma con più grazia - per quanto le mie capacità di debug a basso livello estremamente limitate possano dirlo). Il numero di loop varia a seconda della configurazione del sistema (memoria allocata a PHP, 32 bit/64 bit, ecc. Ecc.) E del sistema operativo, ma la mia vera domanda è: perché succede con un segfault?
- Si tratta semplicemente di come PHP gestisce gli errori di "memoria esaurita"? Sicuramente ci deve essere un modo più elegante di gestire questo?
- Si tratta di un bug nel motore Zend?
- C'è un modo in cui questo può essere controllato o gestito in modo più agevole da uno script PHP?
- Esiste qualche impostazione che generalmente controlla il numero massimo di chiamate ricorsive che è possibile effettuare in una funzione?
Le versioni moderne di php (5 iirc) hanno un limite di profondità sulla ricorsione per prevenire questo tipo di cosa Se è segfaulting, è sicuramente un bug che dovrebbe essere segnalato ... – ircmaxell
[Secondo PHP] (https://bugs.php.net/bug.php?id=43187), questo è il comportamento previsto. – NullUserException
Se stai cercando un linguaggio con un limite di ricorsione, prova [Python] (http://docs.python.org/library/sys.html#sys.setrecursionlimit) – NullUserException