Diagnostic des Fuites de Mémoire - Allowed memory size of # bytes exhausted

J'ai rencontré le redoutable message d'erreur, éventuellement à travers les efforts laborieux, PHP a exécuter de mémoire:

Allowed memory size of #### bytes exhausted (tried to allocate #### octets) file.php sur la ligne 123

L'augmentation de la limite

Si vous savez ce que vous faites et que vous voulez augmenter la limite voir memory_limit:

ini_set('memory_limit', '16M');
ini_set('memory_limit', -1); //no limit

Méfiez-vous! Vous ne pouvez résoudre le symptôme et pas la de problème!

Diagnostiquer la fuite:

Le message d'erreur de points d'une ligne à l'intérieur d'une boucle que je crois être une fuite, ou inutilement-accumulation, de la mémoire. Je l'ai imprimé memory_get_usage() consolidés à la fin de chaque itération et voir le nombre de grandir 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 fins de cette question, supposons le pire de code spaghetti imaginables se cache dans le champ d'application mondial, quelque part dans $user ou Task.

Quels outils, PHP astuces, ou de débogage vaudou peut m'aider à trouver et résoudre le problème?

  • P. S.-j'ai récemment un problème avec ce type exact de la chose. Malheureusement, j'ai aussi trouvé que php a un enfant de destruction des objets problème. Si vous enlevez un objet parent, son enfant objets ne sont pas libérés. Avoir à vous assurer que j'ai utiliser une version modifiée de la fonction unset (qui comprend un appel récursif de tous les objets enfants __autodétruire et ainsi de suite. Plus de détails ici: paul-m-jones.com/archives/262 :: je suis en train de faire quelque chose comme: fonction super_unset( $item ){ if( is_object( $item ) && method_exists( $item, "__autodétruire" ) ){ $article->__autodétruire(); } unset( $item ); }
InformationsquelleAutor Mike B | 2009-05-11