Me he encontrado con el temido mensaje de error, posiblemente a través de un esfuerzo minucioso, PHP se ha quedado sin memoria:
Tamaño de memoria permitido de #### bytes agotados (intentó asignar #### bytes) en file.php en la línea 123
Aumentando el límite
Si sabe lo que está haciendo y desea aumentar el límite, consulte memory_limit :
ini_set('memory_limit', '16M');
ini_set('memory_limit', -1); // no limit
¡Tener cuidado! ¡Es posible que solo esté resolviendo el síntoma y no el problema!
Diagnosticando la fuga:
El mensaje de error apunta a una línea dentro de un bucle que creo que está perdiendo o acumulando memoria innecesariamente. Imprimí memory_get_usage()
declaraciones al final de cada iteración y puedo ver que el número crece lentamente hasta que alcanza el límite:
foreach ($users as $user) {
$task = new Task;
$task->run($user);
unset($task); // Free the variable in an attempt to recover memory
print memory_get_usage(true); // increases over time
}
Para los propósitos de esta pregunta, supongamos que el peor código espagueti imaginable se esconde en algún lugar de alcance global en $user
o Task
.
¿Qué herramientas, trucos de PHP o depuración de vudú pueden ayudarme a encontrar y solucionar el problema?