Долгое подключение к БД MySQL на PHP и Windows 7

Эпичная проблема с подключением к базе данных MySQL существует на Windows 7. Я не знаю, есть ли аналогичные проблемы на других платформах, но опишу суть проблемы и её решение на примере сборки PHP, MySQL и Windows 7 (это кстати может быть и всеми любимый ненавистный Денвер и XAMPP и какие-то ещё исчадья нубского ада).

Итак, вот как выглядит проблема на практике.

Допустим, у нас есть тщательно вылизанный сайт, который весьма неплохо работает на Linux-based или shared-хостинге, и который неплохо работал на домашней девелоперской станции на базе Windows XP, пока не поставили Windows 7. После того, как мы переустановили Windows и поставили “семёрочку”, начинаются тормоза в работе сайта, а именно – каждая страница открывается заметно дольше, время открывания страниц увеличивается на несколько секунд.

При попытке производить анализ и замеры внутри кода выясняется, что тормозят запросы к БД. Каждый запрос выполняется как минимум 1 секунду, даже если это банальное получение одной строки из одной таблицы по PRIMARY-ключу. Переустановка версий PHP и MySQL ничего не даёт.

А теперь внимание – солюшен!

Проблема происходит от того, что в Windows 7 по умолчанию отсутствует ассоциация имени домена localhost с адресом 127.0.0.1. Чтооо? Какого чёрта? Да, друзья, как ни печально но вот такой косяк.

И теперь каждый раз когда вы пытаетесь законнектиться к домену по имени localhost, винда лезет в интернет (!) находит там на одном из своих мегасервисов, что localhost соответствует вашему внешнему (!) IP-адресу и только тогда цепляется к нему. Естественно на то, чтобы сделать запрос через внешний интерфейс (и получить ответ) требуется дополнительное время. Отсюда и тормоза.

Так как же бы нам это обойти? А очень просто.

Вариант номер один – эпичный. Находим в винде файл hosts (кто запамятовал – он лежит в папке c:\Windows\system32\drivers\etc\) и добавляем туда запись для локалхоста

127.0.0.1     localhost

Вариант номер два – не менее эпичный. Просто заходим в конфиг вашего мегасайта и меняем dbhost на 127.0.0.1.

PROFIT!!!!

P.S. Кому эта статья принесла пользу – не поленитесь написать в комментариях. Если есть какие-то дополнительные вопросы – спрашивайте там же.

P.P.S. Как показали немногочисленные опыты над сабжем, добавление строки в hosts помогает не всегда. Поэтому, друзья, используем прямой IP. Это надёжнее.

Подписаться
Уведомление о
guest
19 Комментарий
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Oleg
Oleg
6 лет назад

Я был просто в вх__! 2 часа долбался….
Кстати, в хосте уже прописано – не помогало, а вот замена хоста при подклюении с localhost на 127.0.0.1 спасла!

P.S. – коннектилось 1,1 секунду(!) после замены 0.047759 с.
Спасибо!

Oleg
Oleg
6 лет назад
Reply to  Epsilon

Угу, впредь тоже постараюсь ip ишники прописывать, и граватар не забывать менять =)

Oleg
Oleg
6 лет назад

Да, кстати, возможно вы мне подскажите… гуглю на тему ограничения количества запросов от юзеров, на уровне apache – толковых тем очень мало =(

Oleg
Oleg
6 лет назад
Reply to  Epsilon

В идеале сделать ограничение на количество запросов в секунду на каждого юзера.
Сервис который делаю взаимодействует с API, которые соответственно мне ограничения тоже диктуют. =(
Более того, доже минимальной защиты от тупо зажатой F5 нет – с этим однозначно нужно что то елать.

Oleg
Oleg
6 лет назад
Reply to  Epsilon

Да, в сторону nginx тоже поглядываю… наверное нужно переходить.

Oleg
Oleg
6 лет назад

И судя по количеству промахов по кнопкам – в первую очередь нужно лечь спать XD

Дмитрий Мирошников

О Господи! Вы великий человек! Данная проблема напрягала долгое время, пока терпение не лопнуло. Не ожидай, что решение окажется столь простым и топорным! Вот как можно догадаться, что использовано богомерзкое 127.0.0.1 mpa.one.microsoft.com вместо 127.0.0.1 localhost, меняя которое, всё равно ничего не решишь, а решениеце-то вот оно, просто до безобразия. Спасибо огромное, с 1,5 секунд до 0,5 в среднем снизилось, ура!

6 лет назад

Очень рад, что удалось кому-то помочь.

Руслан Бармалей
6 лет назад

Респект за статью.. напрягала задержка в 1s при коннекте)) а решение вот оно!

Олександр Штовба
6 лет назад

Преогромнейшая благодарность!

Евгений Волонтеров

аццкий +, второй вариант решил проблему, с 1,028 мсек до 0.002 мсек при конекте

Роман Колесник
6 лет назад

Спасибо огромное! Целый день бьюсь, не мог понять в чём дело. А тут всё так просто оказалось. Автору респект!!!!

Makl Vlad
5 лет назад

Спасиб,выручил, а то прям беда

Алексей Котенко
5 лет назад

Спс! Часа три уже ищу косяк!!!!

Леонид Маршев
5 лет назад

спсбо, пмгло

Pavel Komarkov
5 лет назад

Спасибо. Очень помогло. Кст. таже проблема осталась и на windows 8.1
Вариант 1: заметно уменьшил время ожидания
Вариант 2: элемент ожидания можно сказать исключил вообще