Warum ist die Antwort auf localhost so langsam?

59

Ich arbeite an einem winzigen kleinen PHP-Projekt für einen Freund von mir und habe eine WAMP-Umgebung für die lokale Entwicklung eingerichtet. Ich erinnere mich an die Tage, als die Antwort von meinem lokalen Apache 2.2 sofort erfolgte. Leider, jetzt, da ich von einem langen, langen Urlaub zurückgekommen bin, finde ich die Reaktionen von localhostschmerzhaft langsam.

Es dauert ungefähr 5 Sekunden, um eine 300-Byte-HTML-Seite zu erhalten.

Wenn ich mir den Task-Manager anschaue, belegen die httpdProzesse (2) 0% der CPU und insgesamt ist mein Computer nicht ausgelastet (0-2% CPU-Auslastung).

Warum ist die Latenz so hoch? Gibt es eine Apache-Einstellung, die ich ändern könnte, um den Thread möglicherweise mit einer höheren Priorität auszuführen oder so? Es scheint, als ob es einfach schläft, bevor es die Antwort gibt.

Peter Perháč
quelle
1
Ist die localhostLösung richtig DNS-weise? ping localhostsollte sofort mit zurückkommen 127.0.0.1.
Alexis Lê-Quôc
das funktioniert gut, Antwort in <1ms erhalten
Peter Perháč
Ich dachte, Firefox könnte das Problem sein, aber es dauert sogar 5s im IE, also muss es entweder eine Systemeinstellung oder eine Apache-Einstellung oder Gremlins sein.
Peter Perháč
2
Hat es das gleiche Verhalten beim Anfordern von statischem Inhalt (dh beim Laden http://localhost/index.html)? Wenn nicht, könnte es sich um ein PHP-Problem handeln, nicht um ein Apache-Problem.
Marcus Spiegel
5
Die vielen und unterschiedlichen Antworten auf diese Frage zeigen, dass es Dutzende, wenn nicht Hunderte verschiedener Gründe gibt, warum Seitenanforderungen langsam sein können. Wenn Sie zu dieser Frage gekommen sind, weil Sie ebenfalls langsame Seitenanforderungen haben, müssen Sie die Ursache der Langsamkeit genauer untersuchen, bevor Sie hier eine nützliche Antwort erhalten. straceund tcpdumpsind nützliche Werkzeuge dafür.
Ladadadada

Antworten:

59

Bei der Einstellung der ServerNameEigenschaft in wurden httpd.confdie Verzögerungen behoben (sie betrugen im schlimmsten Fall bis zu 10 Sekunden):

# 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
quelle
12
Dies funktioniert - wünschte, ich könnte zweimal
stimmen
8
Das behebt es auch für mich! Von 10s Latenz auf 2ms gegangen!
DouglasHeriot
Ich kämpfte stundenlang und dies war die Lösung.
William Carswell
1
Warum ist dies ein Problem, wenn localhost ordnungsgemäß behoben wird? Was passiert in diesen 10 Sekunden, bevor es antwortet? Warten Sie auf eine Auszeit?
milan
3
@Elipticalview Wie der Kommentar in der Datei sagt; If your host doesn't have a registered DNS name, enter its IP address here.
sshow
21

Ich hatte genau das gleiche Problem.

Das Setzen von localhost redirect auf 127.0.0.1 in der hosts-Datei hat nicht geholfen. Die Optimierung des MySQL-Servers hat nicht geholfen (InnoDB -> MyISAM, Änderung vieler cachebezogener Anweisungen in my.ini).

Dann habe ich web webgrind benutzt und das Problem auf "new PDO (...)" eingegrenzt. Ändern

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

zu

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

in dsn für PDO hat sich das problem komplett gelöst ! Die Ladezeit der Seite stieg von über 3000 ms auf 16 ms .

Allerdings bin ich wirklich verwirrt, warum die "127.0.0.1 localhost" -Zeile in der hosts-Datei nicht geholfen hat.

michalko
quelle
3
Kann mir jemand sagen, welche Datei ich bearbeiten soll, damit sie funktioniert?
Giri
1
Sie sollten die Zeile bearbeiten, in der Sie eine Verbindung zur Datenbank herstellen (in Ihrem PHP-Skript). Zum Beispiel ändern Sie die Zeile: $link = new PDO('mysql:host=localhost;dbname=dp-ui;charset=utf8');zu $link = new PDO('mysql:host=127.0.0.1;dbname=dp-ui;charset=utf8');
Michalko
Ich habe kürzlich an einer EXT-JS-Anwendung gearbeitet und habe große Probleme damit, dass MYSQL-Datenabfragen zu lange dauern, um zu antworten. MYSQL war im Grunde zu langsam. Gott sei Dank, habe hier die Antwort erhalten ..... habe gerade meinen Host im Verbindungsskript geändert von: host = localhost; to host = 127.0.0.1 Meine Serverantworten sind von 3 Minuten (180 Sekunden) auf weniger als 1 Sekunde gestiegen. Danke vielmals.
user184985
Das hat mein Problem gelöst. Seltsam ... Ich habe dieses Problem in SQLite nicht bemerkt
Mladen Janjetovic
2
Das gleiche für mich, aber nur für WordPress. Musste "localhost" durch "127.0.0.1" in wp-config.php ersetzen
Adrian
20

Das Problem betraf die Haupteinstellungsdatei von Apache httpd.conf.

Ich habe das gefunden:

Es gibt drei Möglichkeiten, PHP für die Arbeit mit Apache 2.x unter Windows einzurichten. Sie können PHP als Handler, als CGI oder unter FastCGI ausführen. [Quelle]

Und so ging ich in die Einstellungen des Apache und sah, wo das Problem lag: Ich hatte es als CGI eingerichtet, anstatt es als Modul zu laden. Dies führte php-cgi.exedazu, dass jedes Mal, wenn ich eine Anfrage machte, gestartet und heruntergefahren wurde. Dies verlangsamte meine localhostEntwicklung.

Ich habe die Einstellungen geändert, um PHP als Apache- MODUL zu laden und jetzt funktioniert alles perfekt. :)

So laden Sie das PHP-Modul für Apache 2.x:

1) füge folgende Zeilen in ein httpd.conf

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

AddHandler application/x-httpd-php .php

(ps ändern sich C:/phpzu Ihrem Pfad. Ändern Sie auch php5apache **. dll zu Ihrem vorhandenen Dateinamen)

2) Um die PHP-Ausführung nur für .php-Dateien einzuschränken, fügen Sie Folgendes hinzu httpd.conf:

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

3) setze den Pfad der php.ini in httpd.conf(wenn nach dem Neustart ein Fehler auftritt , dann entferne diese Zeile wieder)

PHPIniDir "C:/php"

Ich danke Ihnen allen für Ihre Bemühungen.

Peter Perháč
quelle
2
Mein Apache stoppt beim Hinzufügen der Zeilen, wie in der Quelle erwähnt. Wie mache ich in Windows?
AgA
Dieser Link ist abgelaufen. Verwenden Sie diese: goo.gl/2EVth9
T.Todua
7

Ich hatte das gleiche Problem und entdeckte schließlich, dass es von zwei Tatsachen herrührte:

  1. Ich benutze Mac OS X Mavericks
  2. Ich habe über die URL auf mein Projekt zugegriffen, http://myproject.local/weil ich eine Zeile 127.0.0.1 myproject.localeingegeben habe/etc/hosts

Das Problem tritt auf, weil die .localtld für den Bonjour-Dienst reserviert ist, und zwar seit Mac OS X Lion (10.7).

Das Ändern der tld für etwas anderes hat das Problem behoben.

lepix
quelle
6

Überprüfen Sie, ob /etc/hostses korrekt ist. So was:

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

****Geben Sie an der Stelle Ihren Hostnamen an.

morpheus
quelle
Das war bei mir der Fall. Meine Domain wurde in der IPv4-Zeile festgelegt, aber nicht in IPv6.
Rafael Beckel
Gleiche für mich. Anfragen haben> 5 Sekunden gedauert, bevor ich die zusätzliche Zeile in / etc / hosts eingefügt habe. Jetzt läuft mein Zeug in ca. 0,1 Sek.
mwallisch
Bring mich in die richtige Richtung. Hinzugefügt 127.0.0.1 something.atmy.localhostund jetzt dauert die Anfrage nicht mehr 20 Sekunden. Stattdessen antwortet der lokale Apache sofort. Ich weiß nicht so viel über Netzwerke. Ich denke, der Domainname wird zu langsam aufgelöst, weil etwas nicht richtig konfiguriert ist.
Robsch
4

httpd.confStellen Sie sicher, dass Sie die Einstellung vornehmen HostnameLookups Off.

drAlberT
quelle
6
Ich habe anscheinend keine apache.conf-Datei. Außerdem habe ich in allen Dateien nach der HostnameLookups-Direktive gesucht und sie in der manuellen Datei core.html.en gefunden. Es stand, dass es standardmäßig ausgeschaltet ist, also denke ich, dass es ausgeschaltet ist
Peter Perháč,
3

Falls es jemandem hilft, hatte ich dieses Problem und es lief darauf hinaus, dass die DNS-Suche nicht korrekt war .

Der DNS-Server auf dem Server wurde auf eingestellt. 127.0.0.1Ich habe ihn so geändert, dass er die öffentlichen DNS-Server von Google verwendet. Dadurch wurde er ein ganzer Haufen schneller.

Toby Allen
quelle
2

Die Frage hat einen Tag apache-2.2, aber wenn jemand von diesem schändlichen Problem auch auf WAMP mit Apache 2.4 + PHP 5.5 betroffen ist , hat die folgende Antwort auf SO den Trick für mich getan:

Bearbeiten httpd.confund deaktivieren Sie das Laden des CGI-Moduls, indem Sie diese Zeile kommentieren :LoadModule cgi_module modules/mod_cgi.so

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

Marco Demaio
quelle