繁体   English   中英

HTTP 错误 500 当 object 缓存在 Laravel 中时

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM