«Нет маршрута к хосту» (HY000 / 2002) ошибка mysqli на удаленном сервере время от времени - что я могу сделать, кроме связи с хостом?

0

Время от времени я получаю следующую ошибку: Warning: mysqli_connect(): (HY000/2002): No route to host in (путь к моему mysqli_connect). Мой сайт находится на удаленном сервере, принадлежащем моему веб-хосту, поэтому проблема может быть на их стороне, но прежде чем обвинять их в возникновении такой ошибки, я хочу убедиться, что это не моя ошибка. На самом деле, я ожидаю, что это будет моя вина по нескольким причинам:

  • хостинговая компания является одной из самых популярных в моей стране, и все же поиск Google в HY000/2002 и ее имя не нашли ничего значимого. Кажется, у других нет этой проблемы с ними.
  • Я впервые столкнулся с этой проблемой после предыдущего серьезного изменения моего кода (php, mysql, несколько фрагментов javascript). Это может быть просто совпадение, но, скорее всего, это не так.
  • если это была ошибка сервера, я ожидал бы, что соединение сбойное сообщение и останется мертвым в течение некоторого времени. Однако после каждой такой ошибки я могу просто перезагрузить страницу, и проблема окончена... для нескольких перезагрузок.

Шаблон, который я нашел еще, состоит в том, что существует некоторая (~ 1%) вероятность запуска ошибки при запуске mysqli_connect. Каждая функция, работающая с базой данных, имеет свой собственный файл db.php (где инициализируется база данных), поэтому части кода, в которых вызывается множество вложенных функций для вызова базы данных, довольно опасны (до 10%, что перезагрузка будет приводят к сбою), тогда как те, где все запросы выполняются без вызовов функций, являются "безопасными".

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

Что я изменил, прежде чем я впервые столкнулся с этой проблемой:

  • Я превратил большинство моих запросов mysqli в подготовленные заявления. Немногие функции были универсальными - если бы я хотел прокормить их параметризуемыми аргументами вместо пользовательского куска кода SQL, мне пришлось бы разбить их на другие функции 10+. Я знаю, что сохранение непараметризированных запросов - это плохая практика, но я удостоверился, что я очистил все содержимое, которое может попасть в функцию, поэтому изменение их на 100% безопасных параметризованных запросов кажется задачей с небольшим приоритетом. Если это не вызвало проблемы, я подумал об этом некоторое время, потому что мои функции "mysqli_query", как правило, вызываются в самых "опасных" частях моего сайта.
  • переход от статического к JavaScript API Карт Google
  • некоторые изменения в таблицах в моей базе данных, но не в самой базе данных
  • файл очистки.htaccess (ранее я запретил кэширование по причинам тестирования - никаких причин для этого на живом сайте)

Вот мой файл db.php - то же самое, что было до начала проблем (пароль не реален):

<?php
  $spojeni=mysqli_connect('mysql01','pavel','mypasswd');
  if (!$spojeni) die('Nepodařilo se připojit k databázi.');
  mysqli_query($spojeni, "USE ehistory");
  mysqli_set_charset($spojeni,'utf8');
  mysqli_query($spojeni, "SET COLLATION_CONNECTION = 'utf8_czech_ci';");
?>

Я не могу опубликовать весь сайт (или даже все запросы) здесь, поэтому прокомментируйте и спросите, считаете ли вы, что часть моего кода должна быть важной; в таком случае добавьте объяснение, почему это может иметь значение.

EDIT: я спросил свой веб-хост и получил IP-адрес, который следует заменить на "mysql01". Я заменил "mysqli01" на IP-адрес, и ничего не изменилось. Что еще я могу сделать?

Теги:
database
mysqli

2 ответа

2

Мой сайт находится на удаленном сервере, принадлежащем моему веб-хосту, поэтому проблема может быть на их стороне, но прежде чем обвинять их в возникновении такой ошибки, я хочу убедиться, что это не моя ошибка. На самом деле, я ожидаю, что это будет моя вина по нескольким причинам:

mysql01 не является полным доменным именем (FQDN). Используйте IP-адрес или попросите свой веб-хостинг для исправленного полного доменного имени.

  • 0
    Спасибо, что указали мне в правильном направлении. Однако, в конце концов, это не помогло - см. Мое редактирование.
1

Это, по-видимому, проблема IP-маршрутизации (сетевой уровень 3). Я считаю, что единственное, что нужно проверить на вашей стороне, - это то, что каждый раз сервер mysqli_connect() задает правильный IP-адрес/имя сервера MySQL. Чтобы устранить возможные проблемы с резольвером, попробуйте использовать простой IP вместо имени хоста.

  • 0
    Я могу сказать, что две вещи - это длинные запросы (вы всегда получаете ошибку на одной и той же странице?), А другой возможной проблемой может быть неправильный коммутатор, который отбрасывает пакеты. В этом случае другие клиенты также должны быть затронуты. Определенно, вы имеете дело с проблемой тайм-аута MySQL. Вы всегда можете проверить свой код на другом хостинге (есть несколько дешевых хостингов за 1 или 2 доллара), которые вы можете использовать для тестирования.
  • 0
    Извините, что больше не могу вам помочь :( У меня кончились идеи.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню