2010-03-06 5 views
13

Wie kann PHP Speicherlecks, Pufferüberläufe, Stacküberläufe und andere Fehler dieser Art verursachen? Kann PHP überhaupt solche Fehler verursachen?PHP zum Absturz bringen

+1

Hoffentlich nicht. Es sollte solche Fehler erkennen und vermeiden, bevor sie auftreten. – Gumbo

+2

http://StackOverflow.com/Questions/849549/detecting-memory-leaks-in-Large-php-stacks – Pavunkumar

+1

Meinst du PHP die Engine oder PHP-Skripte auf der Engine laufen? –

Antwort

11

Durch eine Art unendliche Rekursion können Sie einen PHP-Absturz verursachen.

Zum Beispiel kann eine Datei, die sich selbst rekursiv erfordert sollte einen Stapelüberlauf verursachen:

require __FILE__; 

Oder eine Rekursion in der magischen __sleep() Methode, die ein Objekt deserialisieren soll, fordert jedoch serialize() statt:

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

serialize(new sleepCrasher()); 

Oder ein class destructor, die neue Instanzen erstellt:

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(); 

Neben einer rekursiven __toString():

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

strval(new toStringCrasher()); 

Es gibt andere Szenarien, die Rekursion PHP gegen geschützt ist. Zum Beispiel den Aufruf einer rekursiven Funktion ohne Exit-Bedingung oder eines rekursiven Generatorgenerators. Diese verursachen keinen Absturz, aber einen schwerwiegenden Fehler Allowed memory size of ....

Weitere Beispiele könnten Sie sehen:

+4

Liebe, dass: 'Shell_Exec (" killall -11 httpd ");' – p4bl0

+0

Ich hoffe für diese Jungs wert wird dies nicht die automatisch angenommene Antwort, weil es kaum beantwortet Frage. Nettes Beispiel obwohl. –

1

PHP ist eine interpretierte Sprache, so dass alle PHP-Skripte von Speicherlecks geschützt sind, Pufferüberlauf und Paketüberfluss.

Wie auch immer Sie Probleme als solche verwendet werden:

Integer Überlauf, wenn Sie eine Nummer zu groß zuweisen es überläuft, und da keine Ausnahme auftreten.

Nicht genügend Arbeitsspeicher, mehr Speicher als Speichergröße konfiguriert in der php.ini mit

2

Sie können entweder die Dinge tun, die überläuft in jeder Sprache (wie rekursiv Aufruf der aktuellen Funktion verursachen würde, gedankenlos Speicher Essen, etc .) oder sich auf den guten alten PHP-Interpreter verlassen, um diese Aufgabe zu erledigen. Werfen Sie einen Blick auf how many memory leaks were fixed in PHP5 (Mein Favorit: In 5.2.6 behoben bug #44069: 'Große Speicherverbrauch mit Verkettung mit . anstelle von .=').

Alles in allem ist PHP ok (höchstens), wenn Sie nur eine einzige HTTP-Anfrage bedienen möchten. Aber man kann nicht wirklich ausgefeilte Sachen damit machen (ich habe einmal versucht, einen Peer2Peer Client zu implementieren, der Server ist nach nur 10 Minuten an Speichermangel gestorben - könnte natürlich ein Fehler für mich sein, aber ich hatte mehrere Tage damit verbracht, Lücken zu finden mein eigener Code - ohne Erfolg.

Verwandte Themen