Эпичная проблема с подключением к базе данных 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. Это надёжнее.
Я был просто в вх__! 2 часа долбался….
Кстати, в хосте уже прописано — не помогало, а вот замена хоста при подклюении с localhost на 127.0.0.1 спасла!
P.S. — коннектилось 1,1 секунду(!) после замены 0.047759 с.
Спасибо!
Да, Олег, как правило прописывание в hosts не спасает. Пока не могу сказать с чем такой глюк связан, но на всякий случай от localhost отказался вообще. Прямой IP надёжнее.
Угу, впредь тоже постараюсь ip ишники прописывать, и граватар не забывать менять =)
Да, кстати, возможно вы мне подскажите… гуглю на тему ограничения количества запросов от юзеров, на уровне apache — толковых тем очень мало =(
А с какой целью это нужно делать? Дело в том, что просто взять и ограничить запросы нельзя — можно сильно навредить, т.к. другие пользователи получат отказ при попытке зайти на сайт. Нужно более чётко сформировать требования.
В идеале сделать ограничение на количество запросов в секунду на каждого юзера.
Сервис который делаю взаимодействует с API, которые соответственно мне ограничения тоже диктуют. =(
Более того, доже минимальной защиты от тупо зажатой F5 нет — с этим однозначно нужно что то елать.
Ну скажем так, тупо зажатая F5 не должна приносить серверу никакого вреда. Если это как-то влияет на производительность — имеет смысл подумать о смене провайдера или оптимизации, ведь в реальной системе частота запросов куда более высокая.
В остальном да, есть модули под Apache, не уверен в их качестве, правда, поскольку апач в «боевых» системах не использую уже вот лет 5, наверное. Nginx куда более производителен и не отжирает кучу памяти сам по себе. Ибо у него совершенно иной принцип работы.
Да, в сторону nginx тоже поглядываю… наверное нужно переходить.
И судя по количеству промахов по кнопкам — в первую очередь нужно лечь спать XD
О Господи! Вы великий человек! Данная проблема напрягала долгое время, пока терпение не лопнуло. Не ожидай, что решение окажется столь простым и топорным! Вот как можно догадаться, что использовано богомерзкое 127.0.0.1 mpa.one.microsoft.com вместо 127.0.0.1 localhost, меняя которое, всё равно ничего не решишь, а решениеце-то вот оно, просто до безобразия. Спасибо огромное, с 1,5 секунд до 0,5 в среднем снизилось, ура!
Очень рад, что удалось кому-то помочь.
Респект за статью.. напрягала задержка в 1s при коннекте)) а решение вот оно!
Преогромнейшая благодарность!
аццкий +, второй вариант решил проблему, с 1,028 мсек до 0.002 мсек при конекте
Спасибо огромное! Целый день бьюсь, не мог понять в чём дело. А тут всё так просто оказалось. Автору респект!!!!
Спасиб,выручил, а то прям беда
Спс! Часа три уже ищу косяк!!!!
спсбо, пмгло
Спасибо. Очень помогло. Кст. таже проблема осталась и на windows 8.1
Вариант 1: заметно уменьшил время ожидания
Вариант 2: элемент ожидания можно сказать исключил вообще