PHP CURL timing out but CLI CURL works PHP CURL timing out but CLI CURL works curl curl

PHP CURL timing out but CLI CURL works


Nginx does not spawn your php-cgi.exe processes for you. If you came from Apache like me and used mod_fcgid, you will find that you have many php-cgi.exe processes in the system.

Because Nginx does not spawn the PHP process for you, you will need to start the process yourself. In my case, I have php-cgi.exe -b 127.0.0.1:9000 running as a service automatically. Nginx then pushes all requests for PHP to the PHP handler and receives a response.

Problem: PHP-FPM does not work on windows (as of 5.4.9). FPM is a neat little process manager that sits in the background and manages the spawning and killing of PHP processes when processing requests.

Because this is not possible, on Windows, we can only serve 1 request at a time, similar to the problem experienced here.

In my case, the following happens: Call a page in my application on sometestsite.com which makes a call to php-cgi.exe on 127.0.0.1:9000. Inside, a CURL request calls a page on endpoint.sometestsite.com. However, we are unable to spawn any new PHP processes to serve this second request. The original php-cgi.exe is blocked by serving the request that is running the CURL request. So, we have a deadlock and everything then times out.

The solution I used (it is pretty much a hack) is to use this python script to spawn 10 PHP processes.

You then use an upstream block in nginx (as per the docs for the script) to tell nginx that there are 10 processes available.

Things then worked perfectly.

Having said that, please do not ever use this in production (you are probably better off running nginx and php-fpm on Linux anyway). If you have a busy site, 10 processes may not be enough. However, it can be hard to know how many processes you need.

However, if you do insist on running nginx with php on windows, consider running PHP-FPM within Cygwin as per this tutorial.


Be sure that you run script on console from same user that used for run cgi process. If they not same - they may have different permissions. For me problem was in firewall rules that disallow open external connections for owner of cgi process.