У меня есть проект в производстве, сделанный с Laravel 5.4 на AWS, с EC2 и RDS (с автоматическим масштабированием).В обычный день наша текущая конфигурация не имеет проблем с обработкой определенного количества пользователей, но иногда это количество пользователей растет достаточно, чтобы начать генерировать эту ошибку Max Connections DB [1040], даже если мы настроили автоматическое масштабирование, чтобы избежать этого(Я думаю, что реплика требует достаточно времени для запуска, пока у нас все еще есть пользователи, пытающиеся получить к ней доступ).
Итак, в файле Handler.php мы поместили этот код, чтобы показать пользовательскую страницу, информирующую пользователя о проблеме (а не только общие сообщения!)
if ($e instanceof \PDOException) {
Log::error('Data Base Exception');
$errCode = $e->getCode();
switch ($errCode) {
case 1040:
return response()->view("errors.database", []);
break;
default:
return response()->view("errors.500", [], 500);
break;
}
}
Проблема в том, что, по-видимому, laravel открывает более 1 соединения одновременно, даже если это всего лишь один запрос GET (это происходит с любым запросом на проекте), поэтому Handler.php сообщать об этом дважды.Вот посмотрите на файл журнала, сгенерированный при создании этого исключения.
[2018-10-11 14:04:09] production.ERROR: Data Base Exception
[2018-10-11 14:04:09] production.ERROR: Data Base Exception
Я проверил это в своей локальной среде, установив атрибут max_connections из mysql в 1
set global max_connections = 1;
Thisвыдает исключение в соответствии с намерением, но HTML-страница с информацией о проблеме также появляется дважды, как журнал.
html с ошибкой для пользователя
Любопытновещь: когда я устанавливаю max_connections atributte равным 2, исключение не генерируется и laravel обрабатывает запрос нормально.
EDIT: в этом случае это работает, потому что я не учел, что использую DBeaverдля доступа к базе данных.Но проблема с выдачей исключения дважды сохраняется
Вопрос в том, что делает Laravel, которому нужно 2 соединения, даже когда только один пользователь пытается получить доступ?Или, может быть, это связано с попыткой переподключения?