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

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

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

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

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

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

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

На практике это означает, что если поиск в localhost хосте IPv6 успешный, но MySQL не связан с петлей IPv6, вам нужно будет дождаться одного цикла тайм-аута соединения (очевидно, на машине OP это 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 для loopback). Это связывает сервер с этим адресом и только с этим адресом.

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

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

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

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

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

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

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

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

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

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

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