【问题标题】:Fetch large amount of data in laravel 4.2在 laravel 4.2 中获取大量数据
【发布时间】:2015-12-17 17:51:47
【问题描述】:

我开发了一个群发短信软件。该软件每天发送数百万条短信。现在我想用数百万个数据做一些报告。但它无法获取所有数据。它获取27000 行或更少。我只使用 2 个字段 id 和手机号码应用查询。

当我在我的其他应用程序中尝试使用原始 php 代码时,它工作正常,但 laravel 无法获取所有数据。它显示内存大小耗尽错误。

在我的php.ini 内存限制是128M

现在我想知道在 laravel 中获取数百万数据的最佳方法是什么。或者我应该实施任何其他技术。

【问题讨论】:

  • 你如何尝试获取所有数据?
  • 您是否尝试将数据转储到文件中?

标签: php mysql laravel laravel-4


【解决方案1】:

你可以使用块方法。

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

如果您需要处理大量(数千)条 Eloquent 记录,使用 chunk 命令可以让您无需使用所有 RAM。

或者

您可以在没有内存限制的情况下运行composer update,您可以按照以下方式进行

php -d memory_limit=-1 composer update

【讨论】:

    【解决方案2】:

    我从@sblawrie 得到解决方案,答案来自this github 威胁。

    $query = DB::table('users')->where('name', 'John');  //Pretend this is a huge data set
    
    $statement = $query->getConnection()->getPdo()->prepare($query->toSql());
    $statement->execute($query->getBindings());
    
    while ($record = $statement->fetch(PDO::FETCH_ASSOC)) {
        //Do whatever you want, one row at a time
    }
    

    【讨论】:

      【解决方案3】:

      首先,您可以尝试使用ini_set() 增加内存限制:

      ini_set('memory_limit','128M');
      

      不断增加它,直到你能得到你需要的记录。

      但是,请务必记住,如果您经常这样做,这样做可能会影响服务器的性能。请参阅thisstackoverflow 答案,了解有关确定什么对您的用例安全的更多信息。

      如果您的服务器没有足够的内存来一次检索您想要的所有记录,您将不得不分批获取记录。这可以使用take()offset() eloquent 方法来实现。

      使用takeoffset 方法:

      Model::take(1000)->offset(1001)->get();
      

      这将从第 1001 个查询结果开始检索 1000 条记录。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-02-05
        • 2016-01-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-02
        • 2021-11-14
        • 1970-01-01
        相关资源
        最近更新 更多