Должен ли я пинговать сервер mysql перед каждым запросом?
Поэтому мне было интересно, должен ли я или не должен пинговать сервер mysql (mysqli_ping), чтобы убедиться, что сервер всегда активен перед запуском запроса?
9 answers
Вы не должны пинговать MySQL перед запросом по трем причинам:
- Это ненадежный способ проверки того, что сервер будет работать, когда вы попытаетесь выполнить свой запрос, он вполне может снизиться за время между ответом на пинг и запросом.
- Ваш запрос может завершиться ошибкой, даже если сервер работает.
- По мере увеличения объема трафика на ваш сайт вы будете добавлять много дополнительных накладных расходов в базу данных. Это не редкость в корпоративных приложениях, которые использовали этот метод видеть, как огромное количество ресурсов базы данных тратится впустую на пинги.
Лучший способ справиться с подключениями к базе данных - это обработка ошибок (попытка/перехват), повторные попытки и транзакции.
Подробнее об этом в блоге производительности MySQL: Проверка на наличие активного подключения к базе данных, считающегося вредным
В этом сообщении в блоге вы увидите, что 73 % нагрузки на этот экземпляр MySQL было вызвано приложениями, проверяющими, работает ли БД.
Я этого не делаю. Я полагаюсь на тот факт, что у меня будет ошибка подключения, если сервер исчезнет, и я попытаюсь что-то сделать.
Выполнение пинга может сэкономить вам немного времени и, по-видимому, будет более отзывчивым к пользователю, но ошибка быстрого подключения не намного лучше, чем ожидание нескольких секунд, за которым следует ошибка подключения. В любом случае, пользователь ничего не может с этим поделать.
Нет.
Проводите ли вы пинг, прежде чем переходить туда в браузере, просто чтобы убедиться, что сервер запущен?
Поэтому мне было интересно, должен ли я или не должен пинговать сервер mysql (mysqli_ping), чтобы убедиться, что сервер всегда активен перед запуском вопрос?
Не совсем. Если он не работает, вы узнаете об этом из сообщений об ошибках, поступающих через ваши запросы, или при подключении к базе данных. Вы можете получить ошибку mysql с помощью:
mysql_error()
Пример:
mysql_connect(......) or die(mysql_error());
Это не стандартный способ справиться с этим... Если есть исключение, тогда вы с ним разберетесь.
Это чем-то похоже на разницу между проверкой существования файла перед попыткой его открыть или обнаружением исключения "файл не найден" при его возникновении... Если это очень, очень распространенная и вероятная ошибка, ее, возможно, стоит проверить раньше, но обычно выполнение должно проходить нормально, а исключения должны перехватываться и обрабатываться при их возникновении.
Вообще говоря, нет.
Однако, если у вас есть длительный сценарий, например, какой-то внутренний процесс, который называется заданием cron, где это может быть промежуток времени между подключением и последующими запросами, mysqli_ping()
может быть полезно.
В этом случае полезно установить значение mysqli.reconnect
в значение true в php.ini.
Нет.
Просто потому, что проверка прошла успешно, не означает, что запрос будет выполнен. Что делать, если сервер становится недоступным между моментом, когда вы его проверяете, и временем, когда вы выполняете запрос?
По этой причине вам все равно придется исправлять ошибки в запросе. И если вы это сделаете, вы можете просто положиться на это как на свою основную ловушку ошибок.
Добавление пинга просто добавляет ненужные обходы, в конечном счете замедляя ваш код.
Единственный раз, когда я могу придумать, как это сделать, - это если база данных
1. не критично для функционирования вашего приложения, и,
2. он имеет тенденцию находиться в автономном режиме.
Кроме этого, нет.
Единственный раз, когда было бы целесообразно использовать ping, - это если бы вы внедряли свою собственную систему пула подключений к бд. Даже в этом случае я бы не пинговал перед каждым запросом, просто при каждом "подключении"/извлечении из пула.