Ver this example (y el article he vinculado debajo de la pregunta):
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n"; // 120172
echo memory_get_peak_usage() . "<br>\n"; // 121248
$x = str_repeat('x', 80000);
echo memory_get_usage() . "<br>\n"; // 120172
echo memory_get_peak_usage() . "<br>\n"; // 201284
Como se puede ver, en un punto de PHP habían agotado casi el doble de memoria. Esto se debe a que antes de asignar la cadena 'x' al $x
, PHP crea la nueva cadena en la memoria, mientras mantiene la variable anterior en la memoria también. Esto podría haberse evitado con unset
ting $x
.
Otro ejemplo:
for ($i=0; $i<3; $i++) {
$str = str_repeat("Hello", 10000);
echo memory_get_peak_usage(), PHP_EOL;
}
Esto sería algo como
375696
425824
425824
En la primera iteración $str
sigue vacío antes de la asignación. En la segunda iteración, $str
mantendrá la cadena generada. Cuando se llame a str_repeat
por segunda vez, no sobrescribirá inmediatamente $str
, pero primero cree la cadena que se asignará en la memoria. Entonces termina con $str
y el valor que se le debe asignar. Doble memoria. Si de borra $str
, esto no sucederá:
for($i=0;$i<3;$i++) {
$str = str_repeat("Hello", 10000);
echo memory_get_peak_usage(), PHP_EOL;
unset($str);
}
// outputs something like
375904
376016
376016
qué es importante? Bueno, el artículo vinculado lo resume bastante bien con
Esto no es crítico, excepto cuando lo es.
No hace daño desarmar sus variables cuando ya no las necesita. Tal vez se encuentre en un host compartido y quiera iterar sobre grandes conjuntos de datos. Si la desconexión impediría que PHP terminara con Tamaño de memoria permitido de XXXX bytes agotados, entonces vale la pena el pequeño esfuerzo.
Lo que también debe tenerse en cuenta es que, incluso si la duración de la solicitud es de solo un segundo, duplicar el uso de memoria reduce a la mitad la cantidad máxima de solicitudes simultáneas que se pueden atender. Si de todos modos no estás cerca del límite del servidor, a quién le importa, pero si lo estás, un simple desarmado podría ahorrarte el dinero para obtener más RAM o un servidor adicional.
* (relacionado) * http://www.php.net/manual/en/features.gc.refcounting-basics.php y http://blog.preinheimer.com/index.php?/ archives/354-Memory-usage-in-PHP.html – Gordon
Gracias por esos enlaces. Dan excelentes explicaciones. – dd0x