2010-03-06 10 views
13

¿Cómo puede PHP causar pérdidas de memoria, desbordamientos de búfer, desbordamientos de pila y cualquier otro error de ese tipo? ¿Puede PHP incluso causar tales errores?Causando PHP fallar

+1

Esperemos que no. Debe detectar y evitar dichos errores antes de que sucedan. – Gumbo

+2

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

+1

¿Te refieres a PHP el motor o scripts PHP que se ejecutan en la parte superior del motor? –

Respuesta

11

Al causar alguna recursión un tanto infinita, puede causar un bloqueo de PHP.

Por ejemplo, un archivo que requiere de forma recursiva en sí debe causar un desbordamiento de pila:

require __FILE__; 

O una recursión en el __sleep() método mágico que se supone que unserialize un objeto, pero pide serialize() lugar:

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

serialize(new sleepCrasher()); 

O un class destructor que crea nuevas instancias:

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

Así como un recursivo __toString():

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

strval(new toStringCrasher()); 

Hay otros escenarios de recursividad que PHP está protegido contra. Por ejemplo, llamar a una función recursiva sin una condición de salida o un generador recursivo de auto-rendimiento. Estos no causan un bloqueo, sino un error fatal Allowed memory size of ....

Para más ejemplos, es posible que desee ver:

+4

Me encanta ese: 'shell_exec (" killall -11 httpd ");' – p4bl0

+0

Espero que este tipo de chicos no se convierta en la respuesta aceptada automáticamente, ya que apenas responde al pregunta. Buen ejemplo sin embargo. –

1

PHP es un lenguaje interpretado, por lo que todos los scripts PHP están protegidos de las pérdidas de memoria, desbordamiento de búfer y desbordamiento de pila.

Cómo siempre se encontrará con problemas tales como:

Desbordamiento de enteros, si asigna un número demasiado grande que se desbordará, y no se producirá ninguna excepción.

Fuera de la memoria, el uso de más memoria que el tamaño de memoria configurada en su php.ini

2

Usted puede hacer las cosas que podría causar desbordamientos en cualquier idioma (como llaman recursivamente la función actual, sin pensar que comen la memoria, etc. .) o confíe en el buen viejo intérprete de PHP para hacer ese trabajo. Simplemente eche un vistazo a how many memory leaks were fixed in PHP5 (Mi favorito: En 5.2.6 arreglaron bug #44069: 'Gran uso de memoria con concatenación usando . en lugar de .=').

En general PHP es ok (a lo sumo) si solo desea servir una única solicitud HTTP. Pero no puedes hacer cosas sofisticadas con eso (una vez intenté implementar un cliente Peer2Peer, el servidor murió por falta de memoria después de solo 10 minutos; podría ser un error en mi nombre, por supuesto, pero había pasado varios días buscando filtraciones en mi propio código - en vano).