Почему ответ на localhost такой медленный?


59

Я работаю над крошечным PHP-проектом для моего друга, и у меня есть настройка среды WAMP для локальной разработки. Я помню дни, когда ответ от моего локального Apache 2.2 был немедленным. Увы, теперь, когда я вернулся из долгого, долгого отпуска, я нахожу реакцию localhostмучительно медленной.

Требуется около 5 секунд, чтобы получить страницу размером 300B HTML.

Когда я смотрю на диспетчер задач, httpdпроцессы (2) используют 0% ЦП, и в целом мой компьютер не загружен (загрузка ЦП 0-2%).

Почему задержка такая высокая? Есть ли какие-либо настройки Apache, которые я мог бы настроить, чтобы поток работал с более высоким приоритетом или что-то в этом роде? Кажется, что он просто спит, прежде чем подать ответ.


1
Правильно ли localhostразрешается DNS? ping localhostдолжен вернуться мгновенно с 127.0.0.1.
Алексис Ле-Квок

это работает отлично, ответ получен в <1ms
Peter Perháč

я думал, что Firefox может быть проблемой, но занимает 5 секунд даже в IE, поэтому должны быть либо некоторые настройки системы, либо настройки Apache, либо gremlins.
Петер Перхач

2
Имеет ли он такое же поведение при запросе статического контента (т.е. при загрузке http://localhost/index.html)? Если нет, то это может быть проблема PHP, а не проблема Apache.
Маркус Шпигель

5
Многочисленные ответы на этот вопрос показывают, что существуют десятки, если не сотни разных причин, запросы страниц могут быть медленными. Если вы пришли к этому вопросу, потому что у вас слишком медленные запросы страниц, вам нужно глубже изучить причину медлительности, прежде чем вы сможете получить полезный ответ здесь. straceи tcpdumpполезные инструменты для этого.
Ладададада

Ответы:


59

Для меня установка ServerNameсвойства в httpd.confфиксированные задержки (в худшем случае они были до 10 секунд):

# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
ServerName 127.0.0.1:80

12
Это работает - хотелось бы, чтобы я проголосовал дважды
hohner

8
Это исправляет это и для меня! Прошло с 10 с задержки до 2 мс!
Дуглас Хериот

Я боролся часами, и это было решением.
Уильямкарсвелл

1
почему это проблема, если localhost разрешается правильно? что происходит в эти 10 секунд, прежде чем он отвечает? ждать где-нибудь тайм-аут?
Милан

3
@Elipticalview Как говорится в комментарии в файле; If your host doesn't have a registered DNS name, enter its IP address here.
шоу

21

У меня была та же проблема.

Установка перенаправления localhost на 127.0.0.1 в файле hosts не помогла. Оптимизация сервера MySQL не помогла (InnoDB -> MyISAM, изменив многие директивы, связанные с кэшем, в my.ini).

Затем я использовал webgrind и сузил проблему до вызова «new PDO (...)». изменения

mysql:host=localhost;dbname=dp-ui;charset=utf8 

в

mysql:host=127.0.0.1;dbname=dp-ui;charset=utf8

В DSN для PDO полностью решена проблема ! Время загрузки страницы увеличилось с 3000 мс до 16 мс .

Однако я действительно смущен, почему строка «127.0.0.1 localhost» в файле hosts не помогла.


3
Может кто-нибудь сказать мне, какой файл я должен отредактировать, чтобы он работал?
Гири

1
Вы должны отредактировать строку, где вы подключаетесь к базе данных (в вашем PHP-скрипте). Например, изменить строку: $link = new PDO('mysql:host=localhost;dbname=dp-ui;charset=utf8');до $link = new PDO('mysql:host=127.0.0.1;dbname=dp-ui;charset=utf8');
michalko

Недавно я работал над приложением EXT-JS, и у меня возникли огромные проблемы с запросами данных MYSQL, которые слишком долго отвечали. MYSQL был в основном слишком медленным. Слава Богу, получил ответ здесь ..... просто изменил мой хост в скрипте подключения с: host = localhost; на хост = 127.0.0.1. Ответы моего сервера изменились с 3 минут (180 секунд) до менее чем 1 секунды. Большое спасибо.
user184985

Это решило мою проблему. Странно ... Я не заметил этой проблемы в SQLite
Младен Янетович

2
То же самое для меня, но только для WordPress. Пришлось заменить «localhost» на «127.0.0.1» в wp-config.php
Адриан

20

Проблема была с основным файлом настроек Apache httpd.conf.

Я нашел это:

Существует три способа настройки PHP для работы с Apache 2.x в Windows. Вы можете запустить PHP как обработчик, как CGI или как FastCGI. [Источник]

И поэтому я вошел в настройки Apache и увидел, в чем проблема: я настроил его как CGI, а не загружал его как модуль. Это вызвало php-cgi.exeзапуск и выключение каждый раз, когда я сделал запрос. Это замедляло мое localhostразвитие.

Я изменил настройки, чтобы загрузить PHP как модуль Apache, и теперь все работает отлично. :)

Чтобы загрузить модуль PHP для Apache 2.x:

1) вставить следующие строки в httpd.conf

LoadModule php5_module "c:/php/php5apache2.dll"

AddHandler application/x-httpd-php .php

(ps измените C:/phpсвой путь. Также измените php5apache **. dll на ваше существующее имя файла)

2) Чтобы ограничить выполнение PHP только для файлов .php, добавьте это в httpd.conf:

<FilesMatch \.php$> SetHandler application/x-httpd-php </FilesMatch>

3) установить путь к php.ini httpd.conf(если после перезагрузки вы получите ошибку, то удалите эту строку снова)

PHPIniDir "C:/php"

Спасибо всем за ваши усилия.


2
Мой Apache останавливается на добавлении строк, как указано в источнике. Как мне сделать в Windows?
AgA

срок действия этой ссылки истек. Используйте это: goo.gl/2EVth9
T.Todua

7

У меня была та же проблема, и в конце концов я обнаружил, что она исходила из двух фактов:

  1. Я использую Mac OS X Mavericks
  2. Я получил доступ к своему проекту через URL, http://myproject.local/потому что я поставил строку 127.0.0.1 myproject.localв/etc/hosts

Проблема возникает из-за того, что .localtld зарезервирован для службы Bonjour, и это начиная с Mac OS X Lion (10.7).

Изменение tld для чего-то еще решило проблему.


6

Проверьте /etc/hostsправильность. Нравится:

# hostname mobrglnx1 added to /etc/hosts by anaconda

127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 *****

::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 *******

В месте ****укажите ваше имя хоста.


Это был случай для меня. Мой домен был установлен в строке ipv4, но не в ipv6.
Рафаэль Беккель

Мне то же. Запросы заняли> 5 секунд, прежде чем я поместил дополнительную строку в / etc / hosts. Теперь мой материал работает за ~ 0,1 сек.
mwallisch

Поместите меня в правильном направлении. Добавлен 127.0.0.1 something.atmy.localhostи теперь запрос не занимает больше 20 секунд. Вместо этого местный апач отвечает немедленно. Не так много знаю о сетях. Я предполагаю, что доменное имя решается слишком медленно, потому что что-то настроено неправильно.
Robsch

4

По вашему httpd.confобязательно установите настройку HostnameLookups Off.


6
Кажется, у меня нет файла apache.conf, я также искал директиву HostnameLookups во всех файлах и нашел ее в файле руководства core.html.en. Он сказал, что он выключен по умолчанию, поэтому я думаю, что он выключен
Питер Перхач

3

В случае, если это кому-нибудь поможет, у меня возникла эта проблема, и она сводилась к тому, что поиск DNS был некорректным .

DNS-сервер на сервере был установлен на 127.0.0.1- я изменил его, чтобы использовать общедоступные DNS-серверы Google, и это сделало его намного быстрее.


2

В вопросе есть тег apache-2.2, но если на WAMP с Apache 2.4 + PHP 5.5 на кого-то повлияла эта гнусная проблема , следующий ответ на SO помог мне:

отредактируйте httpd.confи отключите загрузку модуля CGI, комментируя эту строку:LoadModule cgi_module modules/mod_cgi.so

https://stackoverflow.com/a/18786773/260080

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.