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


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

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

Author: DaveRandom, 2012-07-03

3 answers

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

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

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

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

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

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

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

Это Хорошо. Просто скажи мне, как это исправить уже!

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

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

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

Хотя они звучат довольно важно?

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

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

Так какое же лучшее решение?

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

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

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

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

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

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

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

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

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

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

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

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

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

 49
Author: DaveRandom, 2017-04-13 12:13:43

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

 25
Author: binaryLV, 2012-11-28 02:37:57

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

 0
Author: linepogl, 2012-07-03 12:15:45