如何使用 Laravel 的块来避免内存不足


How do I use Laravel's chunk to avoid running out of memory?

我正在从临时表中提取大约 100k 条记录,对数据进行一些轻微的修改,下载照片,然后将我需要保留的字段放在"主"表中。 这很快就会导致我的应用程序在内存不足时崩溃。

我阅读了关于将 chunk() 与 Larawel 雄辩的 ORM 一起使用的非常简短的文档,但甚至不知道如何开始在我的课堂上实现它。

这是我目前正在做的事情:

    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";
        });
    }
}

每个源(或数据源)都以不同的繁琐工作转储到临时表中。 这工作正常。 然后,我从一个表中抓取所有列表(平均约为 30k)并运行我的 ListingMigrator 方法。

在此示例中,我应该将块放在哪里? 它会替换以下行吗:

$listings = $class::orderBy('MatrixModifiedDT','desc')->get();

我不完全理解雄辩文档中的关闭。 这就是他们要说的全部内容,这是Laravel网站上的代码示例:

    User::chunk(200, function($users)
{
    foreach ($users as $user)
    {
        //
    }
});

chunk 调用应该替换 get 调用 - 它旨在处理 pre-get() 查询生成器对象。

$listings = $class::orderBy('MatrixModifiedDT','desc');
$listings->chunk(200, function($listings) use($feed) {
    $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";
    });
});