Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

php-cgi.exe quits after exactly 500 hits

Tags:

php

windows

nginx

For the life of me, I can't figure this out.

This is my development machine setup:

Windows 7 Home Premium 64 bit,
Webserver: NGINX 1.3.6 c:\users\user_name\devel\nginx
PHP: 5.4.7 c:\users\user_name\devel\nginx\php5

Everything works fine except that after exactly 500 hits, my php-cgi.exe quits unexpectedly. No error logs, no events, nothing. It just dies after 500 hits...EVERY SINGLE TIME. I haven't found a single source of information online to help me on this. All the configuration seems valid and good. This is happening on two different machines (my development desktop and my notebook). I've tried different nginx.conf and php.ini files...still the same.

I just need to get a better idea on how to go about debugging this. Any suggestions?

like image 759
RemoteControlledCows Avatar asked Sep 19 '12 00:09

RemoteControlledCows


People also ask

What is PHP-CGI exe?

In simple words, php-cgi.exe is the executable for processing PHP requests on the server. This file is needed at the time of php configuration with web servers like IIS. The path to this binary depends on the folder at which PHP is installed on the server.

Do I need PHP-CGI?

If you are running a web server that PHP has module support for, you should generally go for that solution for performance reasons. However, the CGI version enables users to run different PHP-enabled pages under different user-ids. A server deployed in CGI mode is open to several possible vulnerabilities.

Where is PHP-CGI located?

The php-cgi.exe file is located in a subfolder of "C:\Program Files" (in most cases C:\Program Files\Genie-Soft\Genie Timeline\x86\WebServer\PHP\ or C:\Program Files (x86)\Genie-Soft\Genie Timeline\WebServer\PHP\).


3 Answers

I finally figured it out. Maybe it was simple enough that I couldn't find the solution.

Adding:

SET PHP_FCGI_MAX_REQUESTS=0 

to the command file that launches the php-cgi.exe fixed it. I guess it defaults (when not set) to 500 hits before FCGI is killed.

Obviously, there are good reasons for this and as GargantuChet has suggested, settings things up correctly and letting the instances of PHP managed and auto-spawn is a better way to go...but for people who want a quick windows development environment, this can solve some problems.

like image 125
RemoteControlledCows Avatar answered Sep 23 '22 19:09

RemoteControlledCows


The selected answer works, but doesn't allow the CGI server to shut down every so often (after 500 hits in the OPs case).

Like the OP and others mentioned, this shutdown is necessary in a production environment to curtail memory leaks.

In Windows, another solution is to create a batch file that looks like this:

:start
    php-cgi -b 127.0.0.1:9000
    goto start

This will allow the shutdown that was designed to occur, and will almost immediately start php-cgi again.

like image 41
alfadog67 Avatar answered Sep 22 '22 19:09

alfadog67


unvisible EXE file that will LOOP-RUN php-cgi.exe with passing it own command-line params, can be easily compiled in, for example, ms-VCpp6 (phpCgiExeLoop.exe ~28kb):

#include <windows.h>
#include <Shellapi.h>
#include "stdio.h"

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
                     LPSTR     lpCmdLine,      int       nCmdShow)
{   while (1)
    {   SHELLEXECUTEINFO shExInfo = {0};
        shExInfo.cbSize = sizeof(shExInfo);
        shExInfo.fMask = SEE_MASK_NOCLOSEPROCESS;   shExInfo.hwnd = 0;
        shExInfo.lpVerb = "open";            // Operation to perform
        shExInfo.lpFile = "php-cgi.exe";     // Application to start    
        shExInfo.lpParameters = lpCmdLine;   // Additional parameters
        shExInfo.lpDirectory = 0;            shExInfo.nShow = SW_HIDE;
        shExInfo.hInstApp = 0;  

        if (ShellExecuteEx(&shExInfo))
        {   WaitForSingleObject(shExInfo.hProcess, INFINITE);
            CloseHandle(shExInfo.hProcess);
        }
    }
    return 0;
}

and running "phpCgiExeLoop -b 127.0.0.1:9000" instead of "php-cgi.exe -b 127.0.0.1:9000" ...to win-support php creators intention (avoiding possible memory-leaks).

like image 31
Asain Kujovic Avatar answered Sep 25 '22 19:09

Asain Kujovic