【发布时间】:2020-02-07 15:48:29
【问题描述】:
我正在尝试使用 Laravel Excel Export 3.1 版导出大量数据,但我总是内存不足(我的限制是 512M)。
在导出类中:
class ExcelExport implements FromQuery
{
use Exportable;
public function query()
{
return DB::table('myTable')->orderBy('date');
}
}
在控制器中:
Excel::store(new ExcelExport(), 'myFile.xlsx');
从官方文档中我看到以下内容:
“通过使用 FromQuery 关注点,我们可以为导出准备一个查询。这个查询在后台分块执行。”
但它似乎没有按预期工作。
使用查询生成器有问题吗?
另外,有没有办法设置块大小?
我尝试在查询中使用限制子句,如下所示:
public function query()
{
return DB::table('myTable')->orderBy('date')->limit(1000);
}
但不起作用:似乎没有使用限制。
我已经尝试在 try...catch 块中捕获错误:
try{
Excel::store(new ExcelExport(), 'myFile.xlsx');
}
catch(\Exception $e){
Log::error($e->getMessage());
}
但是,它仍然没有捕获任何异常:我看到的只是 500 内部服务器错误。
有人可以帮我吗?
非常感谢您。
【问题讨论】:
-
您无法捕获内存异常 :) 您是否有任何文本或 blob 列类型,我会将它们排除在导出之外。一般来说,当我遇到这些情况时,我们增加了内存使用量。一个想法也可能是将其作为命令运行,因为通常 php cli 没有相同的内存限制。
-
感谢您这么快回复。我没有 blob 数据,但是我无法控制数据量,所以我可以导出 1000 或 100000 条记录。当我阅读“在幕后,这个查询是分块执行的”时,我希望内存限制不再是问题,因为我希望查询是分块执行并附加到文件中的,但它似乎不起作用方法。我不敢相信 512M 的内存不足以管理数据块。有没有办法以某种方式知道/设置块大小?
-
这是一篇关于使用 Laravel 将大量数据导出到 Excel 的文章:dev.to/rap2hpoutre/…