[英]HTTP ERROR 500 when object is cached in Laravel
我的网站运行了好几个星期,我没有对代码/服务器进行任何更改,今天我注意到我收到HTTP ERROR 500
并且偶尔Allowed memory size of 134217728 bytes exhausted (tried to allocate 31424352 bytes)
我的网站具有以下 controller 代码:
$builds = Cache::remember(
'All.builds.page.' . $currentPage . ".by." . $sortBy,
now()->addSeconds(30),
function () use ($sortBy) {
if ($sortBy == 'top') {
return Build::where('private', 0)->has('ratings', '>=', 5)->with(['user', 'hunter', 'ratings', 'views'])->withCount(['ratings as average' => function ($query) {
$query->select(\DB::raw('coalesce(avg(value), 0)'));
}])->orderByDesc('average')->paginate(15)->onEachSide(1);
}
return Build::where('private', 0)->with(['user', 'hunter', 'ratings', 'views'])->orderBy($sortBy, 'DESC')->paginate(15)->onEachSide(1);
});
当$sortBy
设置为top
并且 object 已被缓存时,会发生这种情况。 例如,如果我第一次访问该页面,它将返回评分最高的构建。 如果我刷新页面,我会看到错误。 我必须等待 30 秒以使缓存过期或手动清除缓存以使页面再次工作。
该网站处理的流量是现在的 10 倍,没有任何问题,但现在突然无法正常工作。 有人知道为什么会发生这种情况并可以为我指明正确的方向吗?
我认为您正在尝试将大型数据集缓存到一个文件中,并且 memory 在数据库增长时耗尽,因为此代码使用急切加载,更多数据将被缓存
return Build::where('private', 0)->has('ratings', '>=', 5)->with([
'user', 'hunter', 'ratings', 'views'
])->withCount(['ratings as average' => function ($query) {
$query->select(\DB::raw('coalesce(avg(value), 0)'));
}])->orderByDesc('average')->paginate(15)->onEachSide(1);
您可以尝试最小化结果或根据您的需要将/etc/php/7.3/fpm/php.ini
文件中允许的 memory 限制从半 GB 增加到 2 GB 或更多
从
; memory_limit = 512M
至
memory_limit = 2048M
临时增加调试问题的限制,并注意,这样做可能会导致您的服务器耗尽内存并关闭您的应用程序
希望这可以帮助
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.