Laravel Eloquent cursor() 内存不足
Laravel Eloquent cursor() out of memory
我对 Laravel 的 ORM Eloquent cursor() 方法有疑问。我正在尝试为我的电子商务创建一些分析功能以获得 orders/income 的数量和类似的东西,您可以在我的代码下方查看:
$fromDate = Carbon::now()->startOfYear()->toDateString();
$tillDate = Carbon::now()->endOfYear()->toDateString();
$orders = Order::cursor()->whereBetween('created_at', [$fromDate, $tillDate])->whereIn('status', array(1, 2, 3))->filter(function ($order) {
return $order;
});
$countO = $orders->count();
$sumO = $orders->sum('total');
$orders = VoucherOrder::cursor()->whereBetween('created_at', [$fromDate, $tillDate])->where('status', 1)->filter(function ($order) {
return $order;
});
$countV = $orders->count();
$sumV = $orders->sum('total');
$orders = $countO + $countV;
$income = $sumO + $sumV;
if($orders != 0) {
$avgOrder = $income / $orders;
}
else {
$avgOrder = 0;
}
return view('admin.income', compact('orders', 'income', 'avgOrder'));
我使用 cursor() 来减少内存使用,因为我正在处理大量数据,但我仍然收到此错误:
Allowed memory size of 536870912 bytes exhausted (tried to allocate
2338688 bytes)
我做错了什么?我该如何解决?
尝试编辑 /etc/php5/fpm/php.ini:
memory_limit = 2048M
重启 nginx:
sudo systemctl restart nginx
如果您想在不编辑 php.ini
文件的情况下减少内存使用,我建议使用 chunk
而不是 cursor()
。
Model::chunk(250, function ($data) {
foreach ($d as $data) {
// your code
}
});
这将占用更少的内存,但请记住,与 cursor()
相比,这可能会多消耗几秒钟的执行时间。
我对 Laravel 的 ORM Eloquent cursor() 方法有疑问。我正在尝试为我的电子商务创建一些分析功能以获得 orders/income 的数量和类似的东西,您可以在我的代码下方查看:
$fromDate = Carbon::now()->startOfYear()->toDateString();
$tillDate = Carbon::now()->endOfYear()->toDateString();
$orders = Order::cursor()->whereBetween('created_at', [$fromDate, $tillDate])->whereIn('status', array(1, 2, 3))->filter(function ($order) {
return $order;
});
$countO = $orders->count();
$sumO = $orders->sum('total');
$orders = VoucherOrder::cursor()->whereBetween('created_at', [$fromDate, $tillDate])->where('status', 1)->filter(function ($order) {
return $order;
});
$countV = $orders->count();
$sumV = $orders->sum('total');
$orders = $countO + $countV;
$income = $sumO + $sumV;
if($orders != 0) {
$avgOrder = $income / $orders;
}
else {
$avgOrder = 0;
}
return view('admin.income', compact('orders', 'income', 'avgOrder'));
我使用 cursor() 来减少内存使用,因为我正在处理大量数据,但我仍然收到此错误:
Allowed memory size of 536870912 bytes exhausted (tried to allocate 2338688 bytes)
我做错了什么?我该如何解决?
尝试编辑 /etc/php5/fpm/php.ini:
memory_limit = 2048M 重启 nginx:
sudo systemctl restart nginx
如果您想在不编辑 php.ini
文件的情况下减少内存使用,我建议使用 chunk
而不是 cursor()
。
Model::chunk(250, function ($data) {
foreach ($d as $data) {
// your code
}
});
这将占用更少的内存,但请记住,与 cursor()
相比,这可能会多消耗几秒钟的执行时间。