繁体   English   中英

在Laravel 4.2中获取大量数据

[英]Fetch large amount of data in laravel 4.2

我已经开发了批量短信发送软件。 该软件每天发送数百万条短信。 现在,我要报告一些包含数百万数据的数据。 但是它无法获取所有数据。 它获取27000行或更少。 我仅使用2个字段ID和手机号码应用查询。

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

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

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

您可以使用块方法。

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

如果您需要处理大量(数千个)口才记录,那么使用chunk命令可以使您无需使用所有RAM。

要么

您可以在没有内存限制的情况下运行作曲家更新,并且可以通过以下方式进行

php -d memory_limit=-1 composer update

我从这个 github威胁的@sblawrie答案中获得了解决方案。

$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
}

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

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

不断增加它,直到获得所需的记录。

但是,重要的是要牢记如果定期执行此操作可能会影响服务器性能。 请参考 stackoverflow答案,以获取有关确定对您的用例而言安全的更多信息。

如果您的服务器没有足够的内存来一次检索所有想要的记录,则必须分批处理这些记录。 可以使用雄辩的take()offset()方法来实现。

使用takeoffset方法:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM