我开发了一个批量短信发送软件。该软件每天发送数百万短信。现在我想用数百万的数据做一些报告。但它无法获取所有数据。它获取27000
行或更少。我只使用2个字段ID和手机号码来应用查询。
当我在我的其他应用程序中尝试使用原始php代码时,它工作正常,但是laravel无法获取所有数据。它显示内存大小耗尽错误。
我的php.ini
内存限制为128M
现在我想知道在laravel中获取数百万数据的最佳方法是什么。或者我应该实施任何其他技术。
答案 0 :(得分:2)
您可以使用chunk方法。
1:nrow(data)
如果您需要处理大量(数千)Eloquent记录,使用chunk命令将允许您不使用所有RAM。
或者
您可以在没有内存限制的情况下运行composer update,您可以按照以下方式执行此操作
data[cbind(1:nrow(data), column_index)]
答案 1 :(得分:1)
我从this 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
}
答案 2 :(得分:0)
首先,您可以尝试使用ini_set()
增加内存限制:
ini_set('memory_limit','128M');
继续增加它,直到你能得到你需要的记录。
但是,重要的是要记住,如果您经常这样做,这可能会影响您的服务器性能。有关确定用例安全的详细信息,请参阅this stackoverflow答案。
如果您的服务器没有足够的内存来检索您想要的所有记录,则必须批量记录。这可以使用take()
和offset()
雄辩的方法来实现。
使用take
和offset
方法:
Model::take(1000)->offset(1001)->get();
这将从第1001个查询结果开始检索1000条记录。