74

I am working on a tiny little PHP project for a friend of mine, and I have a WAMP environment setup for local development. I remember the days when the response from my local Apache 2.2 was immediate. Alas, now that I got back from a long, long holiday, I find the responses from localhost painfully slow.

It takes around 5 seconds to get a 300B HTML page served out.

When I look at the task manager, the httpd processes (2) are using up 0% of the CPU and overall my computer is not under load (0-2% CPU usage).

Why is the latency so high? Is there any Apache setting that I could tweak to perhaps make its thread run with a higher priority or something? It seems like it's simply sleeping before it's serving out the response.

masegaloeh
  • 17,978
  • 9
  • 56
  • 104
Peter Perháč
  • 1,069
  • 1
  • 9
  • 13
  • 5
    What the many, varied answers to this question show is that there are dozens, if not hundreds of different reasons page requests can be slow. If you have arrived at this question because you too have slow page requests, you will need to dig deeper into the cause of the slowness before you can get a useful answer here. `strace` and `tcpdump` are useful tools for this. – Ladadadada Nov 01 '12 at 12:20
  • 3
    Does it have the same behaviour when requesting static content (i.e. when loading `http://localhost/index.html`)? If not, it might be a PHP issue, not an Apache issue. – Marcus Spiegel Sep 17 '09 at 17:52
  • @all, I have a question for everybody that posted solutions that involve adding or replacing text with `127.0.0.1`: does it still work if you access `127.0.0.2`, `127.1.2.3`, and so on or does hard-coding `127.0.0.1` create an unnecessary restriction? – Synetech Nov 19 '13 at 21:26
  • 1
    Is `localhost` resolving properly DNS-wise? `ping localhost` should come back *instantaneously* with `127.0.0.1`. – Alexis Lê-Quôc Sep 17 '09 at 17:25
  • that works fine, response received in <1ms – Peter Perháč Sep 17 '09 at 17:36
  • i thought firefox could be the problem, but takes 5s even in IE, so must be either some system setting or Apache setting or gremlins. – Peter Perháč Sep 17 '09 at 17:38
  • Can you check your apache logs? Do you see the source address of the requestor, is it 127.0.0.1 or the IP of the machine? If the latter, apache might be a reverse DNS lookup before responding. Worth checking httpd.conf for that. – Alexis Lê-Quôc Sep 17 '09 at 18:00
  • i found the following in the access log: 127.0.0.1 - - [17/Sep/2009:20:17:16 +0200] "GET /index.html HTTP/1.1" 200 132, so i guess everything is okay and the requestor is 127.0.0.1 – Peter Perháč Sep 17 '09 at 18:27
  • If you are using any type of CMS, make sure that you disable reverse DNS querying in the database. – Bernie Sep 17 '09 at 21:16
  • Is there a chance you are trying to reach the server from a local LAN box using `http://hostname.localdomain/project/test.php`? If so, which name servers do you have set on the box running Apache? Local name servers or the ones provided by the ISP? If you have two name servers at the box and the first one is down, Windows does not switch all the following requests to the second name server, it will always try to connect to the first name server, wait until it times out and *then* probe the second NS. Make sure that every name server you have specified is up and running. If not, are you using ` – kargig Sep 17 '09 at 18:07
  • I tried both localhost and 127.0.0.1 but no difference. I am going to check out the HostnameLookups directive – Peter Perháč Sep 17 '09 at 18:19
  • I don't know if this could help, bu when I added DNS configuration for the NIC on the server, WAMP become so slow on localhost (loads page in ~= 30 sec !). When I removed the DNS config, it becomes fast. Try leaving DNS blank. –  Sep 27 '13 at 08:13
  • It won't let me post an answer due to low reputation, but in my case it was having PHP XDebug turned on. Turn that off and things will get a lot faster. I narrowed it down to PHP XDebug by checking the PHP error log, which had a bunch of XDebug timeout errors in it. C:\xampp\apache\logs\error.log – RedDragonWebDesign Jul 07 '22 at 10:14

8 Answers8

67

For me, setting the ServerName property in httpd.conf fixed the delays (they were up to 10 seconds at worst):

# 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
  • 795
  • 1
  • 6
  • 12
  • 12
    This works -- wish I could upvote twice – hohner May 19 '12 at 20:46
  • 8
    This fixes it for me too! Gone from 10s latency to 2ms! – DouglasHeriot Jul 02 '12 at 05:32
  • I struggled for hours and this was the solution. – williamcarswell Dec 10 '13 at 08:51
  • 2
    why is this a problem if localhost resolves properly? what's going on those 10sec before it responds? waiting to time-out somewhere? – milan Feb 07 '14 at 12:41
  • Also, why are you using an IP for ServerName? In the docs it talks about "Syntax: ServerName [scheme://]fully-qualified-domain-name[:port]", e.g. ServerName https://secure.localhost:80, or is it ServerName https://secure.localhost.:80 (with a right most dot to make it a FQDN? (See: http://httpd.apache.org/docs/current/mod/core.html#servername ) – Elliptical view Mar 09 '14 at 08:06
  • 3
    @Elipticalview As the comment in the file says; `If your host doesn't have a registered DNS name, enter its IP address here.` – sshow Mar 10 '14 at 08:13
25

I had the very same problem.

Setting localhost redirect to 127.0.0.1 in hosts file did not help. Optimizing MySQL server did not help (InnoDB -> MyISAM, changing many cache related directives in my.ini).

Then I used web webgrind and narrowed down the problem to "new PDO(...)" call. Changing

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

to

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

in dsn for PDO completely solved the problem! Page loading time went from over 3000 ms to 16ms.

However I am really confused why the "127.0.0.1 localhost" line in hosts file did not help.

michalko
  • 351
  • 3
  • 2
  • 4
    Can somebody tell me which file I should edit to make it work? – PrivateUser Jun 29 '13 at 20:20
  • 2
    You should edit the line where you are connecting to database (in your PHP script). E.g. change the line: `$link = new PDO('mysql:host=localhost;dbname=dp-ui;charset=utf8');` to `$link = new PDO('mysql:host=127.0.0.1;dbname=dp-ui;charset=utf8');` – michalko Jul 25 '13 at 14:00
  • I was working on an EXT-JS application recently and has a huge problems of MYSQL data queries taking too long to respond. MYSQL was basically too slow. Thank goodness, Got the answer here..... just changed my host in the connection script from: host = localhost; to host = 127.0.0.1 My server responses went from 3min(180secs) to less thant 1 sec. Thanks alot. – user184985 Aug 09 '13 at 05:11
  • This solved my problem. Strange... I didn't notice that problem in SQLite – Mladen Janjetovic Sep 25 '14 at 15:25
  • 2
    The same for me, but just for WordPress. Had to replace "localhost" with "127.0.0.1" in wp-config.php – Adrian Apr 23 '15 at 07:12
  • Same here, after following all the other advice on the page (which probably helped in its own way) with a Laravel app, hosted via XAMPP: `DB_HOST=127.0.0.1 # Use 10.0.2.2 when accessing va Homestead` – Dave Stewart Oct 20 '15 at 10:14
  • This also solved my problem with my MAMP (Windows 10) installation! – Vahid Amiri Sep 17 '16 at 20:34
  • I logged in specifically to upvote this, but it turns out that I already did so in September 2015 and then promptly forgot about it. Completely solved my issue again anyway. – JoeP Feb 28 '17 at 14:02
22

The issue was with Apache's main settings file httpd.conf.

I found this:

There are three ways to set up PHP to work with Apache 2.x on Windows. You can run PHP as a handler, as a CGI, or under FastCGI. [Source]

And so I went into the Apache's settings and saw where the problem was: I had it set up as CGI, instead of loading it as a module. This caused php-cgi.exe to start up and shut down every time I made a request. This was slowing my localhost development down.

I changed the settings to load PHP as an Apache MODULE and now it all works perfectly. :)

To load the PHP module for Apache 2.x:

1) insert following lines into httpd.conf

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

AddHandler application/x-httpd-php .php

(p.s. change C:/php to your path. Also, change php5apache**.dll to your existing file name)

2) To limit PHP execution only for .php files, add this in httpd.conf:

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

3) set path of php.ini in httpd.conf (if after restart you get error, then remove this line again)

PHPIniDir "C:/php"

Thank you all for your efforts.

T.Todua
  • 204
  • 4
  • 14
Peter Perháč
  • 1,069
  • 1
  • 9
  • 13
8

Check if /etc/hosts is correct. Like this:

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

In the place **** give your hostname.

j0k
  • 401
  • 9
  • 16
morpheus
  • 81
  • 1
  • 1
  • It was the case for me. My domain was set in ipv4 line, but not in ipv6. – Rafael Beckel Sep 10 '15 at 00:10
  • Same for me. Requests took > 5 sec before I put the additional line in /etc/hosts. Now my stuff runs in ~0.1 sec. – mwallisch Oct 17 '15 at 12:33
  • Put me into the right direction. Added `127.0.0.1 something.atmy.localhost` and now request doesn't take 20 seconds anymore. Instead the local apache responds immediately. Don't know that much about networks. I guess the domain name gets resolved too slowly, because something is not correcly configured. – robsch Nov 13 '18 at 07:44
7

I had the same problem and finally discover that it was coming from two facts :

  1. I use Mac OS X Mavericks
  2. I accessed my project via the URL http://myproject.local/ because I put a line 127.0.0.1 myproject.local in /etc/hosts

The problem appears because the .local tld is reserved for Bonjour service, and this since Mac OS X Lion (10.7).

Changing the tld for something else fixed the problem.

lepix
  • 171
  • 1
  • 3
4

In your httpd.conf be sure to set the setting HostnameLookups Off.

uınbɐɥs
  • 119
  • 6
drAlberT
  • 10,871
  • 7
  • 38
  • 52
  • 6
    i don't seem to have an apache.conf file, also I searched for HostnameLookups directive in all of the files and I found it in the core.html.en manual file. It said it's Off by default, so I guess it's off – Peter Perháč Sep 17 '09 at 18:28
3

In case it helps anyone, I had this problem and it boiled down to being incorrect DNS lookup.

The DNS Server on the server was set to 127.0.0.1 - I changed it to use the Google Public DNS servers, and that made it a whole heap faster.

uınbɐɥs
  • 119
  • 6
Toby Allen
  • 747
  • 2
  • 10
  • 23
3

The question has a tag apache-2.2, but if someone is affected by this nefarious issue also on WAMP with Apache 2.4 + PHP 5.5, the following answer on SO did the trick for me:

edit httpd.conf and disable the loading of the CGI module by commenting this line: LoadModule cgi_module modules/mod_cgi.so

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

Marco Demaio
  • 580
  • 1
  • 8
  • 22