Domanda

Come PHP perdite di memoria causa, buffer overflow, stack overflow ed eventuali altri errori di questo tipo? Can PHP anche causare tali errori?

È stato utile?

Soluzione

Per causando qualche ricorsione po 'infinita, si può causare un crash di PHP.

Ad esempio, un file che in modo ricorsivo per sé richiede dovrebbe causare un overflow dello stack:

require __FILE__;  

O una ricorsione nella magia __sleep() metodo che si suppone unserialize un oggetto, ma le chiamate serialize() invece:

class sleepCrasher
{
    public function __sleep()
    {
        serialize($this);
    }
}

serialize(new sleepCrasher());

classe distruttore che crea nuova casi:

class destructorCrasher
{
    public function __destruct()
    {
        new destructorCrasher();
    }
}

// Calling __destruct() manually is just for the sake of example, 
// In real scenarios, PHP's garbage collector will crash PHP for you.
(new destructorCrasher())->__destruct();

Così come una ricorsiva __toString() :

class toStringCrasher
{
    public function __tostring()
    {
        return strval($this);
    }
}

strval(new toStringCrasher());

Ci sono altri scenari ricorsione che PHP è protetto contro. Ad esempio, la chiamata una funzione ricorsiva senza una condizione d'uscita o un generatore autonomo rendimento ricorsivo. Questi ultimi non causano un incidente, ma un errore fatale Allowed memory size of ....

Per ulteriori esempi, si potrebbe desiderare di vedere:

Altri suggerimenti

È possibile sia fare le cose che avrebbe causato overflow in qualsiasi lingua (come la chiamata in modo ricorsivo la funzione corrente, senza pensare di mangiare la memoria, etc.) o fare affidamento sulla buona interprete PHP vecchio per fare quel lavoro. Basta dare uno sguardo a quante perdite di memoria sono stati risolti in PHP5 (Il mio preferito: In 5.2.6 hanno fissato bug # 44069 : 'utilizzo della memoria enorme con la concatenazione utilizzando . invece di .=') .

Tutto sommato PHP è OK (al massimo) se si desidera solo servire una singola richiesta HTTP. Ma non si può davvero fare cose sofisticate con esso (una volta ho provato l'attuazione di un cliente Peer2Peer, il server è morto per mancanza di memoria dopo appena 10 minuti - potrebbe essere un bug sul mio conto, naturalmente, ma avevo trascorso diversi giorni a trovare perdite nel il mio codice -. inutilmente)

PHP è un linguaggio interpretato, in modo che tutti gli script PHP sono protetti da perdite di memoria, buffer overflow e stack overflow.

Come mai si incontrano problemi, come ad esempio:

integer overflow, se si assegna un numero troppo grande che traboccherà, e si verificherà non fa eccezione.

Out of memory, usi solo la memoria dimensione della memoria configurata nel tuo php.ini

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top