Wie verwende ich Laravel s Stück zu vermeiden, läuft der Speicher?
Bin ich ziehen um 100k Datensätze aus der temporären Tabellen, tun einige geringfügigen änderungen an den Daten, das herunterladen von Fotos, und dann setzen die Felder, die ich brauche, um in eine "master" - Tabelle. Dies ist schnell verursacht meine app abstürzt, wie es läuft out of memory.
Lese ich die sehr kurze docs auf mit chunk() mit Laravel ist eloquent ORM aber nicht wissen, wie Sie beginnen sogar, es zu realisieren in meiner Klasse.
Hier ist, was ich bin derzeit dabei:
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";
});
}
}
Jeder feed (oder Datenquelle) ausgegeben wird in eine temp-Tabelle in eine andere lästige Pflicht. Das funktioniert auch. Dann schnappe ich mir alle hte Inserate aus einem Tisch (rund 30k im Durchschnitt) und mein ListingMigrator Methode.
Wo lege ich das Stück in diesem Beispiel? Würde es ersetzen Sie die Zeile:
$listings = $class::orderBy('MatrixModifiedDT','desc')->get();
Verstehe ich nicht die Sperrung der beredte Dokumente. Das ist alles, was Sie zu sagen haben und hier ist das code Beispiel aus dem Laravel Website:
User::chunk(200, function($users)
{
foreach ($users as $user)
{
//
}
});
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
chunk
rufen Sie ersetzen sollte dieget
nennen - es ist entworfen, um die Arbeit an der pre-get() query builder Objekt.chunk
beinhaltet das ändern von Datensätzen, die möglicherweise Auswirkungen auf die Abfrage, wie soft gelöscht, Festplatte gelöscht, änderung der Spalte in der Abfrage, etc, dann müssen Sie die surround-Stück mit einer while-Anweisung. Bitte siehe stackoverflow.com/questions/32700537/... und möglicherweise laravel.io/forum/...