php-cgi.exe在500次命中后退出

对于我的生活,我无法弄清楚这一点。

这是我的开发机器设置:

Windows 7家庭高级版64位,
networking服务器:NGINX 1.3.6 c:\ users \ user_name \ devel \ nginx
PHP:5.4.7 c:\ users \ user_name \ devel \ nginx \ php5

一切正常,除了刚刚500命中之后,我的php-cgi.exe意外退出。 没有错误日志,没有事件,什么都没有。 它只是在500次击中后死亡…每一次。 我还没有find一个在线信息来源来帮助我。 所有的configuration似乎有效和良好。 这发生在两个不同的机器上(我的开发桌面和我的笔记本)。 我已经尝试了不同的nginx.conf和php.ini文件…仍然是一样的。

我只需要更好地了解如何进行debugging。 有什么build议么?

我终于弄明白了。 也许这很简单,我找不到解决方案。

添加:

SET PHP_FCGI_MAX_REQUESTS=0 

到启动php-cgi.exe的命令文件修复它。 我想它在FCGI被杀之前默认(没有设置的话)达到500次。

显然,这有很好的理由,正如GargantuChet所说的,正确设置事情,让PHP的实例管理和自动产生是一个更好的方法去…但是对于想要快速的Windows开发环境的人来说可以解决一些问题。

所选的答案是有效的,但是不允许CGI服务器每隔一段时间关闭一次(在OP案件中500次之后)。

像OP和其他人一样,这种关闭在生产环境中是必要的,以减少内存泄漏。

在Windows中,另一个解决方案是创建一个如下所示的批处理文件:

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

这将允许设计发生的关闭,并且几乎立即启动php-cgi。

不可见的EXE文件,将LOOP-RUN与传递它自己的命令行参数的php-cgi.exe,可以很容易地编译,例如,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; } 

并运行“phpCgiExeLoop -b 127.0.0.1:9000”,而不是“php-cgi.exe -b 127.0.0.1:9000”…来赢得支持PHP的创造者的意图(避免可能的内存泄漏)。