Pourquoi la réponse sur localhost est-elle si lente?

59

Je travaille sur un tout petit projet PHP pour un de mes amis et j'ai un environnement d'installation WAMP pour le développement local. Je me souviens du temps où la réponse de mon Apache 2.2 local était immédiate. Hélas, maintenant que je reviens de très longues vacances, je trouve les réponses localhostdouloureusement lentes.

Il faut environ 5 secondes pour obtenir une page HTML de 300 Ko diffusée.

Lorsque je regarde le gestionnaire de tâches, les httpdprocessus (2) utilisent jusqu'à 0% du processeur et, dans l'ensemble, mon ordinateur n'est pas sous charge (0-2% d'utilisation du processeur).

Pourquoi la latence est-elle si élevée? Existe-t-il un paramètre Apache que je pourrais modifier pour que son thread soit exécuté avec une priorité plus élevée ou quelque chose de ce genre? On dirait que c'est simplement dormir avant de servir la réponse.

Peter Perháč
la source
1
La localhostrésolution est-elle correcte en termes de DNS? ping localhostdevrait revenir instantanément avec 127.0.0.1.
Alexis Lê-Quôc
ça fonctionne très bien, réponse reçue en <
1ms
Je pensais que Firefox pourrait être le problème, mais prend 5s même dans IE, donc doit être soit un paramètre système ou un paramètre Apache ou des gremlins.
Peter Perháč
2
At-il le même comportement lors de la demande de contenu statique (c.-à-d. Lors du chargement http://localhost/index.html)? Sinon, il pourrait s'agir d'un problème PHP, pas d'un problème Apache.
Marcus Spiegel
5
Les réponses nombreuses et variées à cette question montrent qu'il existe des dizaines, voire des centaines de raisons pour lesquelles les demandes de page peuvent être lentes. Si vous êtes arrivé à cette question parce que vous avez vous aussi des requêtes de page lentes, vous devrez approfondir la cause de la lenteur avant de pouvoir obtenir une réponse utile ici. straceet tcpdumpsont des outils utiles pour cela.
Ladadadada

Réponses:

59

Pour moi, le paramétrage de la ServerNamepropriété a httpd.confcorrigé les délais (au maximum 10 secondes):

# 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
la source
12
Cela fonctionne - je voudrais pouvoir voter à deux reprises
hohner
8
Cela corrige ça pour moi aussi! Passé de 10s à 2ms!
DouglasHeriot
J'ai lutté pendant des heures et c'était la solution.
williamcarswell
1
pourquoi est-ce un problème si localhost se résout correctement? que se passe-t-il sur ces 10 secondes avant qu'il ne réponde? attendre de passer quelque part?
Milan
3
@Elipticalview Comme le dit le commentaire dans le fichier; If your host doesn't have a registered DNS name, enter its IP address here.
sshow
21

J'ai eu le même problème.

La définition de la redirection de localhost sur 127.0.0.1 dans le fichier hosts n’a pas aidé. L’optimisation du serveur MySQL n’a pas aidé (InnoDB -> MyISAM, modification de nombreuses directives relatives au cache dans my.ini).

Ensuite, j'ai utilisé web webgrind et ai limité le problème à un "nouvel appel PDO (...)". En changeant

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

à

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

dans DSN pour PDO complètement résolu le problème ! Le temps de chargement des pages est passé de plus de 3000 ms à 16 ms .

Cependant, je ne comprends vraiment pas pourquoi la ligne "127.0.0.1 localhost" dans le fichier hosts n'a pas aidé.

Michalko
la source
3
Quelqu'un peut-il me dire quel fichier je devrais éditer pour le faire fonctionner?
Giri
1
Vous devriez éditer la ligne où vous vous connectez à la base de données (dans votre script PHP). Par exemple, changez de ligne: $link = new PDO('mysql:host=localhost;dbname=dp-ui;charset=utf8');vers $link = new PDO('mysql:host=127.0.0.1;dbname=dp-ui;charset=utf8');
michalko le
Je travaillais récemment sur une application EXT-JS et je suis confronté à un énorme problème de requêtes de données MYSQL prenant trop de temps à répondre. MYSQL était fondamentalement trop lent. Dieu merci, j'ai la réponse ici ..... vient de changer mon hôte dans le script de connexion à partir de: hôte = localhost; to host = 127.0.0.1 Les réponses de mon serveur sont passées de 3 min (180 s) à moins de 1 seconde. Merci beaucoup.
user184985
Cela a résolu mon problème. Etrange ... Je n'ai pas remarqué ce problème dans SQLite
Mladen Janjetovic
2
La même chose pour moi, mais juste pour WordPress. Il a fallu remplacer "localhost" par "127.0.0.1" dans wp-config.php
Adrian
20

Le problème était lié au fichier de paramètres principal d'Apache httpd.conf.

J'ai trouvé ça:

Il existe trois façons de configurer PHP pour qu’il fonctionne avec Apache 2.x sous Windows. Vous pouvez exécuter PHP en tant que gestionnaire, en tant que CGI ou sous FastCGI. [La source]

Et je suis donc allé dans les paramètres d'Apache et j'ai vu où était le problème: je l'avais configuré en tant que CGI, au lieu de le charger en tant que module. Cela a provoqué php-cgi.exele démarrage et l’arrêt chaque fois que j’ai fait une demande. Cela ralentissait mon localhostdéveloppement.

J'ai changé les paramètres pour charger PHP en tant que module Apache et maintenant tout fonctionne parfaitement. :)

Pour charger le module PHP pour Apache 2.x:

1) insérer les lignes suivantes dans httpd.conf

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

AddHandler application/x-httpd-php .php

(ps changer C:/phpvotre chemin. Aussi, changez php5apache ** .dll en votre nom de fichier existant)

2) Pour limiter l'exécution de PHP aux fichiers .php uniquement, ajoutez ceci dans httpd.conf:

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

3) définissez le chemin du fichier php.ini dans httpd.conf(si, après le redémarrage, vous obtenez une erreur, supprimez à nouveau cette ligne)

PHPIniDir "C:/php"

Merci à tous pour vos efforts.

Peter Perháč
la source
2
Mon Apache cesse d’ajouter les lignes mentionnées dans la source. Comment faire sous Windows?
AgA
ce lien est devenu périmé. Utilisez ceci: goo.gl/2EVth9
T.Todua
7

J'ai eu le même problème et j'ai finalement découvert qu'il provenait de deux faits:

  1. J'utilise Mac OS X Mavericks
  2. J'ai accédé à mon projet via l'URL http://myproject.local/car j'ai mis une ligne 127.0.0.1 myproject.localdans/etc/hosts

Le problème apparaît car le .localtld est réservé au service Bonjour, et ce depuis Mac OS X Lion (10.7).

Changer le tld pour quelque chose d'autre a résolu le problème.

lepix
la source
6

Vérifiez si /etc/hostsest correct. Comme ça:

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

À la place, ****donnez votre nom d'hôte.

morpheus
la source
C'était le cas pour moi. Mon domaine a été défini dans la ligne ipv4, mais pas dans ipv6.
Rafael Beckel
Pareil pour moi. Les demandes ont pris> 5 secondes avant que je mette la ligne supplémentaire dans / etc / hosts. Maintenant, mes affaires fonctionnent en 0,1 seconde environ.
mwallisch
Mettez moi dans la bonne direction. La 127.0.0.1 something.atmy.localhostdemande ajoutée et maintenant ne prend plus 20 secondes. Au lieu de cela, l'apache local répond immédiatement. Je n'en sais pas beaucoup sur les réseaux. Je suppose que le nom de domaine est résolu trop lentement, car quelque chose n’est pas correctement configuré.
Robsch
4

Dans votre httpd.confêtre sûr de définir le paramètre HostnameLookups Off.

drAlberT
la source
6
je ne semble pas avoir de fichier apache.conf, j'ai aussi cherché la directive HostnameLookups dans tous les fichiers et je l'ai trouvée dans le fichier manuel core.html.en. Il a dit qu'il est désactivé par défaut, donc je suppose que c'est désactivé
Peter Perháč
3

Au cas où cela aiderait quelqu'un, j’avais ce problème et cela se résumait à une recherche DNS incorrecte .

Le serveur DNS sur le serveur était configuré sur 127.0.0.1- je l'ai modifié pour utiliser les serveurs DNS publics de Google, ce qui a accéléré le processus.

Toby Allen
la source
2

La question a la balise apache-2.2, mais si quelqu'un est également concerné par cette question néfaste également sur WAMP avec Apache 2.4 + PHP 5.5 , la réponse suivante sur SO a fait l'affaire pour moi:

éditez httpd.confet désactivez le chargement du module CGI en commentant cette ligne:LoadModule cgi_module modules/mod_cgi.so

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

Marco Demaio
la source