J'ai rencontré le message d'erreur redouté, probablement grâce à un effort minutieux, PHP a manqué de mémoire:
Taille de mémoire autorisée de #### octets épuisés (tentative d'allocation de #### octets) dans file.php à la ligne 123
Augmenter la limite
Si vous savez ce que vous faites et que vous souhaitez augmenter la limite, consultez memory_limit :
ini_set('memory_limit', '16M');
ini_set('memory_limit', -1); // no limit
Il faut se méfier! Vous ne résolvez peut-être que le symptôme et non le problème!
Diagnostiquer la fuite:
Le message d'erreur pointe vers une ligne avec une boucle que je pense être une fuite ou une accumulation inutile de mémoire. J'ai imprimé des memory_get_usage()
déclarations à la fin de chaque itération et je peux voir le nombre augmenter lentement jusqu'à ce qu'il atteigne la limite:
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
}
Pour les besoins de cette question, supposons que le pire code spaghetti imaginable se cache dans une portée globale quelque part dans $user
ou Task
.
Quels outils, astuces PHP ou débogage vaudou peuvent m'aider à trouver et à résoudre le problème?