Подтвердить что ты не робот

PHP для EasyPHP MySQL сервер 1 секунда задержки соединения

Я спрашиваю об этом здесь, потому что я думаю, что это касается не только самого EasyPHP.

В настоящее время я использую EasyPHP в качестве моего сервера разработки WAMP, чтобы создавать веб-приложения. Проблема в том, что когда я получаю объект mysqli для подключения к базе данных, он занимает 1 секунду. Выполнение одного и того же запроса на общем хостинге приводит к скорости более чем в 200 раз быстрее. Должно ли это быть чем-то, о чем я должен беспокоиться? Что касается масштабируемости или переноса моего приложения на другой сервер, было бы разумно потратить некоторое время на то, чтобы узнать, в чем проблема? Я просто предположил, что, возможно, EasyPHP был медленным. Не главное, просто то, что показалось мне интересным.

4b9b3361

Ответ 1

Если у вас возникла эта проблема и с использованием версии Windows до Windows 7, это, вероятно, не ответ на вашу проблему.

Почему это происходит?

Причиной этой проблемы является IPv4 vs IPv6.

Когда вы используете имя хоста вместо IP-адреса, клиент MySQL сначала запускает поиск хоста AAAA (IPv6) для имени и сначала пытается этот адрес, если он успешно разрешает имя на адрес IPv6. Если какой-либо шаг завершится неудачей (разрешение имени или соединение), он вернется к IPv4, запустив поиск A и попробовав этот хост.

На практике это означает, что если поиск IPv6 localhost успешный, но MySQL не связан с петлей IPv6, вам нужно будет дождаться одного цикла тайм-аута соединения (очевидно, на машине OP это 1 секунда) до того, как произойдет резервное копирование IPv4, и соединение будет успешным.

Это не было проблемой до Windows 7, потому что разрешение localhost было выполнено через файл hosts, и оно было предварительно сконфигурировано только с помощью 127.0.0.1 - оно не было с ним с IPv6 ::1.

Так как Windows 7, однако, разрешение localhost встроено в DNS-резольвер, по причинам, указанным здесь. Это означает, что теперь поиск IPv6 будет успешным, но MySQL не привязан к этому IPv6-адресу, поэтому соединение не будет выполнено, и вы увидите задержку, указанную в этом вопросе.

Отлично. Просто скажите, как это исправить!

У вас есть несколько вариантов. Оглядываясь по Интернету, общее "решение", похоже, должно явно использовать IP-адрес вместо имени, но есть несколько причин не делать этого, как связанные с переносимостью, так и неважно:

  • Если вы переместите свой script на другой компьютер, поддерживающий только IPv6, ваш script больше не будет работать.

  • Если вы переместите свой script в среду хостинга на основе nix, волшебная строка localhost будет означать, что клиент MySQL предпочел бы использовать сокет Unix, если он настроен, это более эффективно, чем IP-соединение на основе петли

Они звучат довольно важно, хотя?

Это не так. Вы должны разрабатывать свое приложение, чтобы этот вид определялся в файле конфигурации. Если вы переместите свой script в другую среду, возможно, потребуется другое конфигурирование.

Таким образом, использование IP-адреса не является лучшим решением, но, скорее всего, оно приемлемо.

Итак, какое лучшее решение?

Лучшим способом было бы изменить адрес привязки, который использует сервер MySQL. Однако это не так просто, как хотелось бы. В отличие от Apache, Nginx и почти любого другого разумного сетевого приложения, когда-либо созданного, MySQL поддерживает только один адрес привязки, поэтому это не просто случай добавления другого. К счастью, операционные системы действительно поддерживают немного магии, поэтому мы можем позволить MySQL одновременно использовать как IPv4, так и IPv6.

Вам нужно запустить MySQL 5.5.3 или новее, и вам нужно запустить MySQL с аргументом командной строки --bind-address= (или установить соответствующую опцию в my.ini). У вас есть 4 варианта docs в зависимости от того, что вы хотите сделать:

  • Тот, с которым вы, вероятно, знакомы, и тот, который вы наиболее вероятно (эффективно) используете, 0.0.0.0. Это связывается со всеми доступными адресами IPv4 на компьютере. На самом деле это, вероятно, не самая лучшая вещь, даже если вы не заботитесь о IPv6, так как она страдает теми же угрозами безопасности, что и ::.

  • Явный адрес IPv4 или IPv6 (например, 127.0.0.1 или ::1 для loopback). Это связывает сервер с этим адресом и только с этим адресом.

  • Волшебная строка ::. Это свяжет MySQL с каждым адресом на машине, как с петлей, так и с физическими интерфейсами, в режимах IPv4 и IPv6. Это потенциально угроза безопасности, только сделайте это, если вам нужно, чтобы MySQL принимал соединения с удаленных хостов.

  • Используйте IPv4-отображаемый IPv6-адрес. Это специальный механизм, встроенный в IPv6 для обратной совместимости во время перехода 4 → 6, и он позволяет вам привязываться к определенному IPv4-адресу и его эквиваленту IPv6. Это маловероятно, что вы будете полезны для чего-либо иного, кроме адреса "двойной петли" ::ffff:127.0.0.1. Это, скорее всего, лучшее решение для большинства людей, только привязка к loopback, но позволяющая подключать как IPv4, так и IPv6.

Нужно ли мне изменять файл hosts?

НЕТ. Не изменяйте файл hosts. Решитель DNS знает, что делать с localhost, переопределение его в лучшем случае не будет иметь никакого эффекта, а в худшем случае перепутает ад из резольвера.

Как насчет --skip-name-resolve?

Это также может устранить проблему/быть обязательным для решения проблемы, для связанной, но немного другой причины.

Без этой опции конфигурации MySQL попытается разрешить все IP-адреса подключения клиента к имени хоста с помощью запроса PTR DNS. Если ваш сервер MySQL уже включен для использования IPv6, но соединения все еще занимают много времени, это может быть связано с неправильной настройкой записи обратного DNS (PTR).

Отключение разрешения имен устраняет эту проблему, но имеет другие последствия, в частности, что все разрешения доступа, настроенные на использование имени DNS в Host, будут терпеть неудачу.

Если вы собираетесь это сделать, вам нужно будет настроить все ваши гранты для использования IP-адресов вместо имен.

Ответ 2

У меня была некоторая задержка, когда я использовал localhost как адрес сервера MySQL. Смена его на 127.0.0.1 помогла.

Ответ 3

Независимо от сервера, было бы неплохо использовать постоянные соединения, когда это возможно. В конце концов, нецелесообразно открывать новые соединения все время, когда старые могут выполнять эту работу. Посмотрите manual для mysqli.