Долгое подключение к БД 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 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Oleg

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

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

Oleg

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

Oleg

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

Oleg

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

Oleg

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

Oleg

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

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

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

Руслан Бармалей

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

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

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

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

Роман Колесник

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

Makl Vlad

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

Алексей Котенко

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

Леонид Маршев

спсбо, пмгло

Pavel Komarkov

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