Comment puis-je utiliser Laravel du morceau pour éviter de manquer de mémoire?
Je suis en tirant autour de 100k enregistrements des tables temporaires, en faisant une légère modification sur les données, le téléchargement de photos, puis en plaçant le champs j'ai besoin de garder dans un "maître" de la table. C'est rapidement la cause de mes app crash car il est à court de mémoire.
J'ai lu le très brève de docs sur l'utilisation de chunk() avec Laravel est éloquent ORM, mais ne sais pas comment même de commencer à la mettre en oeuvre dans ma classe.
Voici ce que je fais actuellement:
public function fire()
{
//Turn off query logging
DB::connection()->disableQueryLog();
$feeds = RetsFeed::where('active','=',1)->get();
foreach ($feeds as $feed)
{
$class = "TempListing{$feed->board}";
$listings = $class::orderBy('MatrixModifiedDT','desc')->get();
$listings->each(function($listing) use ($feed) {
ListingMigrator::migrateListing($listing,$feed);
echo "Feed: $feed->board\r\n";
echo "SubcondoName: $listing->SubCondoName\r\n";
echo "Development: $listing->Development\r\n";
echo "\r\n";
});
}
}
Chaque tétée (ou la source de données) est déversé dans une table temporaire dans un autre corvée. Cela fonctionne bien. Ensuite, je prends toutes les listes d'un tableau (qui est d'environ 30k en moyenne) et de gérer mon ListingMigrator méthode.
Où dois-je mettre le morceau dans cet exemple? Serait-il remplacer la ligne:
$listings = $class::orderBy('MatrixModifiedDT','desc')->get();
Je ne comprends pas tout à la fermeture dans la éloquent docs. C'est tout ce qu'ils ont à dire à ce sujet et voici l'exemple de code à partir de la Laravel site:
User::chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});
OriginalL'auteur Chris Farrugia | 2015-01-22
Vous devez vous connecter pour publier un commentaire.
La
chunk
appel doit remplacer leget
d'appel, il est conçu pour fonctionner sur la pré-get() dans le constructeur de requêtes objet.Taille de segment est assez arbitraire et le plus difficile, exigence, c'est que c'est un assez petit nombre de sorte que vous n'avez pas à court de RAM à l'intérieur d'un seul morceau. Si votre base de données n'est pas l'esprit de la charge, de morceaux de 10 sont beaux. Des morceaux de 200 sont probablement aussi bien.
Remarque: si le
chunk
implique la modification des enregistrements qui pourraient affecter la requête, comme les supprime, dur supprime, changement de colonne dans la requête, etc, alors vous devez entourer le bloc avec une instruction while. Merci de voir stackoverflow.com/questions/32700537/... et, éventuellement, laravel.io/forum/...Je suis en cours d'exécution du code avec des morceaux de 2000 entrées. Mes Objets sont ~150 octets après la conversion au format json. Donc cela génère soigné 300KByte morceaux qui fonctionne bien pour ma base de données, les données impliquées et mon mémoire de PHP et d'exécution des limites.
OriginalL'auteur ceejayoz