在laravel 4.2

时间:2015-09-21 06:00:37

标签: php mysql laravel laravel-4

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

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

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

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

3 个答案:

答案 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()雄辩的方法来实现。

使用takeoffset方法:

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

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