xxfpm: 写了一个小巧的FastCGI进程管理器

经测试,支持Win32和Linux-x86平台。对于用php的人,有了这个东西来维护一定数量的进程,就能制服经常崩溃退出的php-cgi啦!!!

Usage: xxfpm path [-n number] [-i ip] [-p port]
Manage FastCGI processes.

-n, –number number of processes to keep
-i, –ip ip address to bind
-p, –port port to bind, default is 8000
-u, –user start processes using specified linux user
-g, –group start processes using specified linux group
-r, –root change root direcotry for the processes
-h, –help output usage information and exit
-v, –version output version information and exit

第一个写得比较标准的终端应用程序,我是看了cygwin的里的一些源代码,然后学会了如何使用getopt,算是写得比较标准的,但是代码也不短。

使用例子:
xxfpm z:/php5/php-cgi.exe -n 5 -p 8080

有人问,如何给程序加入参数?这个不难,使用双引号即可,路径要用”/”而不用”\”。例如要指定php.ini的路径,可以用下面例子:
xxfpm “z:/php5/php-cgi.exe -c z:/php5/php.ini” -n 5 -i 127.0.0.1 -p 8080

如何维护进程:

Windows上使用CreateProcess创建进程,使用WaitForSingleObject等待进程结束;Linux上使用fork和execl创建进程,使用waitpid等待进程结束。Linux的版本多了在创建子进程的时候可以设置进程限制,能够以受限用户方式来运行。

当进程管理器被关闭的时候,它所创建的所有子进程也必须被关闭。Windows上使用JobObject这个东西来把子进程与管理器的进程产生关联,感谢iceboy提供的资料!Linux上通过捕捉关闭信号,然后给所有子进程发送SIGTERM来结束子进程。详见源代码!!!

点击下载:

xxfpm源代码及Win32、Linux32可执行文件

GitHub地址:

https://github.com/78/xxfpm

xxfpm: 写了一个小巧的FastCGI进程管理器》上有77条评论

        1. Xiaoxia 文章作者

          难道是所有php-cgi进程崩溃退出后,没有重新打开?
          你可以试试xxfpm维护一下php-cgi的进程呀,用参数设置一下ip和端口就行了。

          回复
  1. kevinxiao

    博主您好,我现在也是遇到这个问题,但我不太懂技术,我想知道您这个如何使用呢? 大家看了别笑。。。。

    我在cmd里面输入命令行,老是弄不对,能提点一下到我邮箱么,谢谢!

    回复
  2. Hellodoy

    谢谢博主!想请教一个问题,xxfpm这个FastCGI进程管理器是否能够支持自动新增php-cgi.exe线程,以适应请求数?

    回复
    1. Xiaoxia 文章作者

      你好,不会的,只能维持一定数量的进程。你可以修改代码加入这一个新功能的。

      回复
    1. Xiaoxia 文章作者

      要支持windows各种版本,是很有难度的,因为其中用到了win32 api,各个版本都有差异。
      唉,大家还是转投Linux吧……

      回复
      1. tomcat

        呵呵,就是说能不能使php-cgi.exe进程不超过某一个数量。
        我现在遇到的问题是php-cgi正常情况10个左右,但是会突发性瞬间出现50~80个php-cgi进程。
        我研究如何把这个进程限制在一个数值下找到这里的

        回复
  3. ikool

    很好,已经用于生产环境了,win2003下Nginx和xxfpm都以服务的方式运行了。
    观察几天看有没有什么问题。
    谢谢小虾

    回复
  4. tomcat

    请问能不能使php-cgi.exe进程不超过某一个数量。
    我现在遇到的问题是php-cgi正常情况10个左右,但是会突发性瞬间出现50~80个php-cgi进程。
    我研究如何把这个进程限制在一个数值下找到这里的

    回复
  5. Pingback引用通告: Linux下让父进程结束后,子进程自动结束 « Xiaoxia[PG]

      1. Heiher

        是啊,使用 scgi or fcgi 转 cgi 的方式,由 scgi to cgi 中间件通过子进程去执行 php-cgi 解释执行 php 脚本,效率应该是差不多的吧。

        回复
  6. Pingback引用通告: 用iptables让SSH服务对陌生人说不 « Xiaoxia[PG]

  7. shiny

    —————————
    xxfpm.exe – 系统错误
    —————————
    无法启动此程序,因为计算机中丢失 pthreadGC2.dll。尝试重新安装该程序以解决此问题。
    —————————
    确定
    —————————

    回复
      1. 王道忠强流

        我的服务器用了你的xxfpm,还配合了RunHiddenConsole把命令窗口隐藏,startPHP.bat是这么写的。没什么问题吧?

        D:\webser\RunHiddenConsole.exe D:\webser\xxfpm.exe D:\webser\php5317\php-cgi.exe -n 2 -i 127.0.0.1 -p 9000
        D:\webser\RunHiddenConsole.exe D:\webser\xxfpm.exe D:\webser\php5317\php-cgi.exe -n 2 -i 127.0.0.1 -p 9001
        D:\webser\RunHiddenConsole.exe D:\webser\xxfpm.exe D:\webser\php5317\php-cgi.exe -n 2 -i 127.0.0.1 -p 9002
        D:\webser\RunHiddenConsole.exe D:\webser\xxfpm.exe D:\webser\php5317\php-cgi.exe -n 2 -i 127.0.0.1 -p 9003
        D:\webser\RunHiddenConsole.exe D:\webser\xxfpm.exe D:\webser\php5317\php-cgi.exe -n 2 -i 127.0.0.1 -p 9004
        D:\webser\RunHiddenConsole.exe D:\webser\xxfpm.exe D:\webser\php5317\php-cgi.exe -n 2 -i 127.0.0.1 -p 9005
        D:\webser\RunHiddenConsole.exe D:\webser\xxfpm.exe D:\webser\php5317\php-cgi.exe -n 2 -i 127.0.0.1 -p 9006
        D:\webser\RunHiddenConsole.exe D:\webser\xxfpm.exe D:\webser\php5317\php-cgi.exe -n 2 -i 127.0.0.1 -p 9007

        回复
  8. tgy

    自己写了个webserver,但不知如何使用这个进程管理器(如何与之通信),如何支持fastcgi,希望指引

    回复
  9. tgy

    我对PHP的支持是通过ISAPI方式,但为服务器安全稳定性,所以在考虑FASTCGI,但据说FASTCGI方式的性能比ISAPI方式不占多少优势,只是稳定性提高一些,ISAPI方式如果DLL出错易导致WEBSERVER崩溃,但我还做了一些处理,DLL中的工作线程就算发生了一般内存保护性非法访问异常(除了栈溢出等),不会导致WEB崩溃.稳定性和性能都有了保障.

    回复
  10. MEast

    你好,我用的Intel Xeon E5405(8线程),2G内存,Win2003,Nginx1.2.5,PHP5.4.9.PHP用您的xxfpm维护,16个进程(-n 16)。160人登录,Nginx错误日志有17行 [error] 1768#3848: *1585 WSASend() failed (10054: An existing connection was forcibly closed by the remote host) while sending request to upstream。

    回复
      1. DonLu

        我也遇到了一样的问题,一直都是用xxfpm,之前都是好好的,前两个月开始不知道为何就开始出现这个问题,就是502 bad gateway。php版本比较老,5.2.17。试过增加fast-cgi缓存了。每次出现问题时php-cgi进程还在的,重启xxfpm就暂时恢复了,但不久就又会出现问题。

        回复
  11. 地狱星星

    我在windows 2008 R2下使用xxfpm,关机重启时,提示“php-cgi.exe – 应用程序错误: 应用程序无法正常启动(0xc0000142)。”,造成关机失败,请问是什么原因

    回复
  12. Pingback引用通告: 历经磨难将博客从Bo-Blog转换到WordPress | 陈叨叨·幻色

  13. ddd

    博主,为啥不关掉或者隐藏cmd窗口呢??这样的牛X程序都写了,多加几点代码把当前窗口也隐藏掉吧。

    回复
  14. Pingback引用通告: Windows+Nginx+Mysql+PHP环境php-cgi.exe进程自动关闭,退出 | Me

  15. pader

    太赞了,如果能集成 RunHiddenConsole 的功能(比如说带一个参数就自动隐藏窗口),并且可以解决关机时不先关 xxfpm 就出错的情况就完美了。

    回复
  16. xiaoxie

    我在window7 32位系统上使用的时候用xxfpm启动cgi。window会报cgi停止工作。xp或2003完全正常测试php的版本的是5.2.9

    回复
  17. xzhui

    以下问题的环境在window7 32Bit WEBSERVER:nginx1.6.2 PHP:php5.3.29报告如下错误,
    问题签名:
    问题事件名称: APPCRASH
    应用程序名: php-cgi.exe
    应用程序版本: 5.3.29.0
    应用程序时间戳: 53ee40b0
    故障模块名称: php-cgi.exe
    故障模块版本: 5.3.29.0
    故障模块时间戳: 53ee40b0
    异常代码: c0000005
    异常偏移: 00001d29
    OS 版本: 6.1.7601.2.1.0.256.1
    区域设置 ID: 2052
    其他信息 1: 0a9e
    其他信息 2: 0a9e372d3b4ad19135b953a78882e789
    其他信息 3: 0a9e
    其他信息 4: 0a9e372d3b4ad19135b953a78882e789

    回复
      1. rinne0120

        与PHP版本应该无关,具体是什么原因也没有找到规律,今天又在一个人的电脑上发现此类问题了,就是php-cgi进程在不断报错死掉,然后新的cgi进程被创建出来,cpu使用率飙升。刚做完的win10系统第一个就是装的php环境,仅在一台电脑上发生了,其它电脑没事。好像在进程中有个w开头的一个系统报错的程序在不断出现,应该是每次cgi死掉的时候就出现一次。

        回复
  18. Pingback引用通告: Windows php-cgi | IT民工的博客

  19. Pingback引用通告: Day 2 – php-cgi自动退出解决办法 – CHIKUN.TECH

  20. Pingback引用通告: 解决windows下php-cgi进程经常自动关闭 - 锅子博客

地狱星星进行回复 取消回复

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>