2010-04-11 17 views
29

Soy algo nuevo en PHP y me pregunto: ¿Qué tan importante es desarmar variables en PHP? Sé que en idiomas como C, liberamos la memoria asignada para evitar fugas, etc. Al usar las variables de unset on cuando termine con ellas, ¿esto aumentará significativamente el rendimiento de mis aplicaciones?¿Qué tan importante es desarmar variables en PHP?

También hay un punto de referencia en cualquier lugar que compara la diferencia entre usar unset y no usar unset?

+0

* (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

+0

Gracias por esos enlaces. Dan excelentes explicaciones. – dd0x

Respuesta

49

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.

+0

En un proyecto actual estoy usando PHP para generar un número de páginas HTML de tamaño variable moviéndome a través de un bucle, por lo que definitivamente debería deshacer la variable que contiene los contenidos al final de cada bucle. ¿Eso podría ser 'crítico' correcto? – dd0x

+0

@ dd0x En teoría, sí. Pero en la práctica, debe usar algo como XDebug para perfilar su aplicación y ver si realmente es crítica. Considero que desactivar PHP es mucho más que una necesidad de optimización. – Gordon

+0

@ dd0x Solo para agregar, PHP tiene un recolector de basura que asegura que el 99.9% del tiempo no tiene que preocuparse. – Yacoby

3

Las aplicaciones que se escriben en idiomas como C suelen durar muchas horas. Pero el tiempo de ejecución habitual de la aplicación php es de aproximadamente 0,05 segundos. Entonces, es mucho menos importante usar unset.

+5

Si bien puede ser cierto, no es la respuesta correcta. He ejecutado scripts PHP por días. Como PHP es basura, la cantidad de tiempo que un script se ha estado ejecutando es, en su mayor parte, irrelevante. – Yacoby

+2

La respuesta también da la impresión de que 'unset' se requeriría en un script de ejecución larga y que' unset' es el equivalente de 'free'. – Yacoby

+0

@Yacoby "* He ejecutado scripts PHP por días *" Quizás necesite usar algo diferente para tareas específicas. PHP es más adecuado para aplicaciones web, y las páginas web no necesitan ejecutarse durante días. Por supuesto, los servidores web son mucho más potentes ahora 5 años después (incluso los de alojamiento barato por £ 3 por mes) y la recolección de basura PHP se ha mejorado. No se recomienda modificar las variables para liberar recursos. – James

7

Hay muchas situaciones en las que unset no desasignará en realidad gran parte de nada, por lo que su uso en general no tiene sentido a menos que el flujo lógico de su código requiera su inexistencia.

+3

También se debe decir que toda la memoria se libera al final de la ejecución del script de todos modos, por lo que desarmar antes del final de la ejecución no servirá de mucho (e incluso puede ser perjudicial) para el rendimiento. – mattbasta

0

Depende, debe asegurarse de que unset tenga cadenas muy largas (como el contenido de una publicación de blog seleccionada de un db).

<?php 
$post = get_blog_post(); 
echo $post; 
unset($post); 
?> 
Cuestiones relacionadas