【问题标题】: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 方法来实现。
使用take 和offset 方法:
Model::take(1000)->offset(1001)->get();
这将从第 1001 个查询结果开始检索 1000 条记录。