Dlaczego odpowiedź na localhost jest taka wolna?

59

Pracuję nad małym projektem PHP dla mojego przyjaciela i mam konfigurację środowiska WAMP do lokalnego rozwoju. Pamiętam dni, kiedy odpowiedź z mojego lokalnego Apache 2.2 była natychmiastowa. Niestety, teraz, kiedy wróciłem z długiego, długiego urlopu, reakcje są localhostboleśnie powolne.

Dostarczenie strony HTML 300B zajmuje około 5 sekund.

Kiedy patrzę na menedżera zadań, httpdprocesy (2) zużywają do 0% procesora i ogólnie mój komputer nie jest obciążony (0-2% użycia procesora).

Dlaczego opóźnienia są tak duże? Czy jest jakieś ustawienie Apache, które mógłbym ulepszyć, aby być może jego wątek działał z wyższym priorytetem czy coś takiego? Wygląda na to, że po prostu śpi, zanim udzieli odpowiedzi.

Peter Perháč
źródło
1
Czy localhostrozwiązywanie problemów jest prawidłowe pod względem DNS? ping localhostpowinien natychmiast wrócić z 127.0.0.1.
Alexis Lê-Quôc
to działa dobrze, odpowiedź otrzymana w <1ms
Peter Perháč
Myślałem, że Firefox może być problemem, ale trwa 5s nawet w IE, więc musi być jakieś ustawienie systemowe lub ustawienie Apache lub gremliny.
Peter Perháč,
2
Czy zachowuje się tak samo podczas żądania zawartości statycznej (tj. Podczas ładowania http://localhost/index.html)? Jeśli nie, może to być problem PHP, a nie problem Apache.
Marcus Spiegel
5
Wiele różnorodnych odpowiedzi na to pytanie pokazuje, że istnieją dziesiątki, jeśli nie setki różnych powodów, dla których żądania stron mogą być wolne. Jeśli dotarłeś do tego pytania, ponieważ i ty masz powolne żądania stron, musisz głębiej poznać przyczynę powolności, zanim uzyskasz użyteczną odpowiedź tutaj. stracei tcpdumpsą do tego przydatnymi narzędziami.
Ladadadada,

Odpowiedzi:

59

Dla mnie ustawienie ServerNamewłaściwości w httpd.confustalone opóźnienia (najgorsze były do ​​10 sekund):

# 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
sshow
źródło
12
To działa - chciałbym móc dwukrotnie głosować
hohner
8
To też mnie naprawia! Minęło 10 lat opóźnienia do 2 ms!
DouglasHeriot
Walczyłem godzinami i to było rozwiązanie.
williamcarswell,
1
dlaczego jest to problem, jeśli localhost rozwiązuje się poprawnie? co się dzieje przez te 10 sekund, zanim odpowie? czekasz gdzieś na przerwę?
Milan
3
@Elipticalview Jak mówi komentarz w pliku; If your host doesn't have a registered DNS name, enter its IP address here.
sshow
21

Miałem ten sam problem.

Ustawienie przekierowania localhost na 127.0.0.1 w pliku hosts nie pomogło. Optymalizacja serwera MySQL nie pomogła (InnoDB -> MyISAM, zmieniając wiele dyrektyw związanych z pamięcią podręczną w my.ini).

Następnie użyłem webgrind i zawęziłem problem do wywołania „nowego PDO (...)”. Wymiana pieniędzy

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

do

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

w dsn dla PDO całkowicie rozwiązało problem ! Czas ładowania strony wzrósł z ponad 3000 ms do 16 ms .

Jednak jestem naprawdę zdezorientowany, dlaczego wiersz „127.0.0.1 localhost” w pliku hosts nie pomógł.

Michałko
źródło
3
Czy ktoś może mi powiedzieć, który plik powinienem edytować, aby działał?
Giri
1
Powinieneś edytować linię, w której łączysz się z bazą danych (w skrypcie PHP). Np. Zmień linię: $link = new PDO('mysql:host=localhost;dbname=dp-ui;charset=utf8');na $link = new PDO('mysql:host=127.0.0.1;dbname=dp-ui;charset=utf8');
michalko
Niedawno pracowałem nad aplikacją EXT-JS i mam ogromne problemy z pytaniami danych MYSQL, których odpowiedź zbyt długo trwa. MYSQL był w zasadzie zbyt wolny. Dzięki Bogu, otrzymałem odpowiedź tutaj ... właśnie zmieniłem mojego hosta w skrypcie połączenia z: host = localhost; do hosta = 127.0.0.1 Odpowiedzi na mój serwer zmieniły się z 3 minut (180 sekund) na mniej niż 1 sekundę. Wielkie dzięki.
user184985,
To rozwiązało mój problem. Dziwne ... Nie zauważyłem tego problemu w SQLite
Mladen Janjetovic
2
To samo dla mnie, ale tylko dla WordPress. Musiałem zamienić „localhost” na „127.0.0.1” w wp-config.php
Adrian
20

Problem dotyczył głównego pliku ustawień Apache httpd.conf.

Znalazłem to:

Istnieją trzy sposoby skonfigurowania PHP do pracy z Apache 2.x w systemie Windows. Możesz uruchomić PHP jako moduł obsługi, jako CGI lub pod FastCGI. [Źródło]

I tak przeszedłem do ustawień Apache'a i zobaczyłem, gdzie jest problem: skonfigurowałem go jako CGI, zamiast ładować jako moduł. Powodowało php-cgi.exeto uruchamianie i wyłączanie za każdym razem, gdy wysyłałem prośbę. Spowalniało to mój localhostrozwój.

Zmieniłem ustawienia, aby załadować PHP jako MODUŁ Apache i teraz wszystko działa idealnie. :)

Aby załadować moduł PHP dla Apache 2.x:

1) wstaw następujące wiersze do httpd.conf

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

AddHandler application/x-httpd-php .php

(ps zmień C:/phpna ścieżkę. Zmień także php5apache **. dll na istniejącą nazwę pliku)

2) Aby ograniczyć wykonywanie PHP tylko dla plików .php, dodaj to w httpd.conf:

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

3) ustaw ścieżkę php.ini w httpd.conf(jeśli po ponownym uruchomieniu pojawi się błąd, usuń tę linię ponownie)

PHPIniDir "C:/php"

Dziękuję wszystkim za wasze wysiłki.

Peter Perháč
źródło
2
Mój Apache przestaje dodawać wiersze, jak wspomniano w źródle. Jak to zrobić w systemie Windows?
AgA
ten link wygasł. Użyj tego: goo.gl/2EVth9
T.Todua
7

Miałem ten sam problem i w końcu odkryłem, że pochodzi on z dwóch faktów:

  1. Używam Mac OS X Mavericks
  2. I uzyskać mojego projektu za pośrednictwem adresu URL http://myproject.local/, bo umieścić linię 127.0.0.1 myproject.localw/etc/hosts

Problem pojawia się, ponieważ .localtld jest zarezerwowany dla usługi Bonjour, a to od czasu Mac OS X Lion (10.7).

Zmiana tld na coś innego rozwiązała problem.

lepix
źródło
6

Sprawdź, czy /etc/hostsjest poprawne. Lubię to:

# 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 *******

W miejscu ****podaj swoją nazwę hosta.

Morfeusz
źródło
Tak było w moim przypadku. Moja domena została ustawiona w linii ipv4, ale nie w ipv6.
Rafael Beckel,
Dla mnie to samo. Żądania trwały> 5 sekund, zanim umieściłem dodatkową linię w / etc / hosts. Teraz moje rzeczy działają w ~ 0,1 sekundy.
mwallisch
Ustaw mnie we właściwym kierunku. Dodano 127.0.0.1 something.atmy.localhosti teraz żądanie nie trwa już 20 sekund. Zamiast tego lokalny apache odpowiada natychmiast. Nie wiem zbyt wiele o sieciach. Myślę, że nazwa domeny jest rozwiązywana zbyt wolno, ponieważ coś nie jest poprawnie skonfigurowane.
robsch
4

W twojej httpd.confnależy wybrać ustawienie HostnameLookups Off.

drAlberT
źródło
6
chyba nie mam pliku apache.conf, szukałem także dyrektywy HostnameLookups we wszystkich plikach i znalazłem ją w pliku instrukcji core.html.en. Domyślnie jest wyłączone, więc myślę, że jest wyłączone
Peter Perháč,
3

Na wypadek, gdyby komukolwiek to pomogło, miałem ten problem i sprowadzało się to do nieprawidłowego wyszukiwania DNS .

Serwer DNS na serwerze został ustawiony na 127.0.0.1- Zmieniłem go, aby korzystał z publicznych serwerów DNS Google, co przyspieszyło cały stos.

Toby Allen
źródło
2

Pytanie ma tag apache-2.2, ale jeśli ten nikczemny problem dotyczy również WAMP z Apache 2.4 + PHP 5.5 , następująca odpowiedź na SO zrobiła dla mnie lewę:

edytuj httpd.confi wyłącz ładowanie modułu CGI, komentując ten wiersz:LoadModule cgi_module modules/mod_cgi.so

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

Marco Demaio
źródło