Eloquent manger de la mémoire – Taille de la mémoire autorisée de 134217728 octets épuisé

J’ai essayé de travailler aujourd’hui mais j’ai été interrompu par cette erreur:

[Tue Aug 05 09:08:48 2014] [error] [client 93.103.209.208] PHP Fatal error: Allowed memory size of 134217728 bytes exhausted (sortinged to allocate 130968 bytes) in /var/www/dev/vendor/laravel/framework/src/Illuminate/Database/Eloquuent/Model.php on line 643 

Le contrôleur / méthode qui entraîne l’erreur:

 public function show($id) { return $this->layout->content = View::make('users.show', array( 'user' => User::find($id) )); } 

Cependant, si je remplace User::find($id) par DB::table('users')->where('id', '=', $id)->first(); il fonctionne comme un charme. Que se passe-t-il ici avec Eloquent?

J’ai essayé d’augmenter mon memory_limit dans php.ini pour apache & cli à 200-230M mais cela n’a pas aidé. J’ai également essayé de le définir à -1 pour être illimité juste pour voir si cela fonctionnerait mais non alors je ne reçois simplement aucune réponse du serveur. Et oui, j’ai redémarré apache après chaque changement.

CAUSE

Le problème était dû à une méthode de relation dans mon modèle d’utilisateur. Fondamentalement, dans ma classe User, j’avais User { public function user() { return $this->hasOne('User'); } } User { public function user() { return $this->hasOne('User'); } } qui a créé une boucle.

Juste en disséquant le message d’erreur – vous avez une limite de mémoire de 128 Mo de configuration pour PHP, la ligne en question essaie d’allouer ~ 131 Ko supplémentaires

Les variables utilisant le rest de la mémoire ne sont peut-être pas liées à cette fonction, il se pourrait bien que cette partie du code à la recherche de sa mémoire de 131 Ko ne fasse que dépasser la limite de 128 Mo.

J’utiliserais un mécanisme de journalisation pour enregistrer la valeur de retour de memory_get_usage () à différents points de votre code. Cela devrait vous donner une idée du moment où la mémoire est allouée et vous permettre d’optimiser le code.

Changez votre code comme suit:

 ... return $this->layout->content = View::make('users.show')->with(array('user' => User::find($id))); ... // or WITHOUT return $this->layout->content = View::make('users.show')->with(array('user' => User::find($id)));