2010-03-06 13 views
13

W jaki sposób PHP może powodować przecieki pamięci, przepełnienia bufora, przepełnienia stosów i inne tego typu błędy? Czy PHP może powodować takie błędy?Powoduje, że PHP ulega awarii

+1

Mam nadzieję, że nie. Powinien wykrywać i unikać takich błędów, zanim się pojawią. – Gumbo

+2

http://stackoverflow.com/questions/849549/detecting-memory-leaks-in-large-php-stacks – Pavunkumar

+1

Masz na myśli PHP silnika lub skrypty PHP działające na silniku? –

Odpowiedz

11

Poprzez spowodowanie jakiejś nieskończonej rekursji, możesz spowodować awarię PHP.

Na przykład, plik rekurencyjnie wymaga się powinno spowodować przepełnienie stosu:

require __FILE__; 

lub rekursji w magicznym __sleep() metody, która jest rzekomo unserialize obiektu, ale wzywa serialize() zamiast:

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

serialize(new sleepCrasher()); 

Albo class destructor który tworzy nowe instancje:

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

Jak również rekurencyjna __toString():

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

strval(new toStringCrasher()); 

Są inne scenariusze rekursji, że PHP jest chroniony przed. Na przykład wywołanie funkcji rekursywnej bez warunku wyjścia lub rekurencyjnego samopowrotnego generatora. Te nie powodują awarii, ale błąd krytyczny Allowed memory size of ....

Więcej przykładów warto zobaczyć:

+4

Uwielbiam to: 'shell_exec (" killall -11 httpd ");' – p4bl0

+0

Mam nadzieję, że ten facet warty tego nie stanie się automatycznie akceptowaną odpowiedzią, ponieważ prawie nie odpowiada pytanie. Dobry przykład. –

1

PHP jest językiem interpretowanym, więc wszystkie skrypty php są zabezpieczone przed wyciekiem pamięci, przepełnienie bufora i przepełnienie stosu.

jaki kiedykolwiek będziesz miał problemy, takie jak:

Integer overflow, jeśli przypisać numer zbyt duża będzie przepełnienie i nie wystąpi wyjątek.

Out of memory, używając więcej pamięci niż rozmiar pamięci skonfigurowanej w pliku php.ini

2

Można też robić rzeczy, które mogłoby spowodować przepełnienie w dowolnym języku (jak rekurencyjnie wywołując bieżącą funkcję, bezmyślnie jeść pamięć itp .) lub polegać na starym dobrym tłumaczu PHP, aby wykonać to zadanie. Wystarczy spojrzeć na how many memory leaks were fixed in PHP5 (Moje ulubione: w wersji 5.2.6 naprawiono bug #44069: "Ogromne użycie pamięci przy łączeniu za pomocą . zamiast .=").

W sumie PHP to ok (najwyżej), jeśli chcesz tylko obsłużyć jedno żądanie http. Ale nie możesz tak naprawdę robić z nim wyrafinowanych rzeczy (próbowałem kiedyś wdrożyć klienta Peer2Peer, serwer zmarł z powodu niedoboru pamięci po 10 minutach - oczywiście mógł to być błąd w moim imieniu, ale spędziłem kilka dni na znajdowaniu przecieków w mój własny kod - bezskutecznie).

Powiązane problemy