HTTP ERROR 500, когда объект кэшируется в Laravel - PullRequest
0 голосов
/ 15 октября 2019

Мой веб-сайт работал нормально в течение нескольких недель, я не вносил изменений в код / ​​сервер, и сегодня я заметил, что получаю HTTP ERROR 500, а иногда и Allowed memory size of 134217728 bytes exhausted (tried to allocate 31424352 bytes) на одной из страниц моего веб-сайта со следующим кодом контроллера:

$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 и когда объект был кэширован. Например, если я захожу на страницу в первый раз, она вернет сборки с самым высоким рейтингом. Если я обновлю страницу, я увижу ошибку. Мне нужно подождать 30 секунд, пока не истечет срок действия кэша, или вручную очистить кэш, чтобы страница снова заработала.

Веб-сайт обработал в 10 раз больше трафика, чем сейчас, без каких-либо проблем, и теперь всевдруг это не работает. Кто-то знает, почему это происходит, и может указать мне правильное направление?

1 Ответ

0 голосов
/ 15 октября 2019

Я думаю, что вы пытаетесь кешировать большой набор данных в один файл, и при расширении базы данных память исчерпывается, поскольку этот код использует ускоренную загрузку, будет кэшироваться больше данных

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 с половины гигабайта до 2 гигабайт или более в зависимости от ваших потребностей

со

; memory_limit = 512M

до

memory_limit = 2048M

временно увеличьте лимит для отладки вашей проблемы, и имейте в виду, что это может привести к нехватке ОЗУ на вашем сервере и отключению вашего приложения

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...