Чому реакція на localhost така повільна?


59

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

На розсилку HTML-сторінки розміром 300В триває близько 5 секунд.

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

Чому затримка така висока? Чи є параметр Apache, який я міг би налаштувати, щоб, можливо, змусити його потоку працювати з більш високим пріоритетом чи щось таке? Здається, що він просто спить, перш ніж подавати відповідь.


1
Чи localhostправильно вирішувати DNS? ping localhostповинні повернутися миттєво з 127.0.0.1.
Alexis Lê-Quôc

це добре працює, відповідь отримана за <1мс
Пітер Пергач

Я думав, що firefox може бути проблемою, але вона займає 5 секунд навіть в IE, тому повинна бути або якась установка системи, або Apache, або gremlins.
Пітер Пергач

2
Чи має таку саму поведінку при запиті статичного вмісту (тобто при завантаженні http://localhost/index.html)? Якщо ні, це може бути проблема PHP, а не проблема Apache.
Маркус Шпігель

5
Чимало різноманітних відповідей на це запитання свідчить про те, що існує кілька десятків, якщо не сотень різних причин, коли запити сторінок можуть бути повільними. Якщо ви прийшли до цього питання, оскільки у вас занадто повільні запити на сторінку, вам доведеться глибше заглибитися в причину повільності, перш ніж ви зможете отримати корисну відповідь тут. straceі tcpdumpє корисними інструментами для цього.
Ladadadada

Відповіді:


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
Це працює - хотілося б, щоб я міг подати заяву двічі
Хохнер

8
Це це виправляє і для мене! Перейшов від затримки від 10-х до 2мс!
DouglasHeriot

Я боровся годинами, і це було рішення.
williamcarswell

1
чому це проблема, якщо localhost вирішено правильно? що відбувається за ці 10 сек перед тим, як він відгукнеться? чекаєте тайм-ауту десь?
мілан

3
@Elipticalview Як йдеться у коментарі до файлу; If your host doesn't have a registered DNS name, enter its IP address here.
sshow

21

У мене була та сама проблема.

Встановлення localhost переспрямування у 127.0.0.1 у файлі хостів не допомогло. Оптимізація MySQL-сервера не допомогла (InnoDB -> MyISAM, змінивши багато директив, пов'язаних з кешем, в my.ini).

Потім я скористався веб-перемиканням веб-сторінок і звузив проблему для виклику "новий 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" у файлі хостів не допоміг.


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 сек. Дуже дякую.
користувач184985

Це вирішило мою проблему. Дивно ... Я не помітив цієї проблеми в 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 , наступна відповідь на ТА зробила для мене хитрість:

відредагуйте 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.