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

Chr*_*gia 7 php mysql laravel eloquent laravel-4

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

我阅读了关于使用chunk()和Laravel雄辩的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";
        });
    }

}
Run Code Online (Sandbox Code Playgroud)

每个提要(或数据源)都被转储到不同家务中的临时表中.这很好.然后,我从一个表中获取所有hte列表(平均大约30k)并运行我的ListingMigrator方法.

在这个例子中我把块放在哪里?它会取代这条线:

$listings = $class::orderBy('MatrixModifiedDT','desc')->get();
Run Code Online (Sandbox Code Playgroud)

我并不完全理解雄辩文档中的结束.这就是他们要说的全部内容,这里是Laravel网站的代码示例:

    User::chunk(200, function($users)
{
    foreach ($users as $user)
    {
        //
    }
});
Run Code Online (Sandbox Code Playgroud)

cee*_*yoz 16

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";
    });
});
Run Code Online (Sandbox Code Playgroud)

  • @ChrisFarrugia块大小非常随意,唯一的硬性要求是它的数量足够小,所以你不会在一个块内耗尽RAM.如果您的数据库不介意负载,那么10个块就可以了.200块大块也很好. (2认同)
  • 注意:如果`chunk`涉及修改可能影响查询的记录,例如软删除,硬删除,查询中列的更改等,那么您需要使用while语句包围该块.请参阅http://stackoverflow.com/questions/32700537/eloquent-chunk-missing-half-the-results以及可能的http://laravel.io/forum/09-22-2015-chunk-missing-half-the - 结果?页= 1 (2认同)