J'ai rencontré le redoutable message d'erreur, peut-être au prix d'efforts laborieux, PHP a manqué de mémoire :
La taille de mémoire autorisée de #### octets est épuisée (tentative d'allocation de #### octets) dans file.php à la ligne 123
Augmenter la limite
Si vous savez ce que vous faites et que vous voulez augmenter la limite, voir limite_mémoire :
ini_set('memory_limit', '16M');
ini_set('memory_limit', -1); // no limit
Attention ! Vous pourriez ne résoudre que le symptôme et non le problème !
Diagnostic de la fuite :
Le message d'erreur indique une ligne à l'intérieur d'une boucle qui, à mon avis, fait fuir ou accumule inutilement de la mémoire. J'ai imprimé memory_get_usage()
à la fin de chaque itération et on peut 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 le global-scope quelque part dans $user
o Task
.
Quels sont les outils, les astuces PHP ou les trucs de débogage qui peuvent m'aider à trouver et à résoudre le problème ?