Xiaoxia[PG]

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

Internet、Linux、我的代码70 条评论

经测试,支持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

70 条评论

  1. 虾的coding能力就是强

    1. 跟你学习了:-)

    2. 楼主怎么用吖!不懂,用nginx配置php-cgi.exe总自动退出

      1. 是个命令行程序来的,参照本文提及的例子呀!

  2. 用lnmp偶尔502用这个能解决不?

    1. 是什么引起502错误的呢?代理服务器?

      1. 不是代理服务器,lnmp。org的套件,502后重启下php就好了,不知道什么原因。。。

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

  3. 怎么不把设置端口跟ip放出来设置呢,放里面每次修改还要编译很麻烦的

    1. 有参数设置的嘛!!!
      xxfpm z:/php5/php-cgi.exe -n 5 -i 127.0.0.1 -p 8080

      1. 不好意思,呵呵,之前没有看见,后来仔细看-h 看见了,

  4. 博主辛苦了,小程序很有用呢~

  5. 很不错的软件,找了很久了,谢谢博主。

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

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

    1. 文章里不是写了使用说明吗???
      按着里面的例子做。

    2. 还是不行的话,代码能不能看懂呢?也不是很长,就是注释少了点唉。

      1. 最后弄明白了用法,现在已经用上。感谢

  7. 用上,非常好,多谢。。。。终于解决了自动退出问题。

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

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

  9. 就我目前测试,该程序不支持Windows 7 64Bit环境,希望能够改进,谢谢

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

      1. 太遗憾了。。。

    2. 可以支持 win7 64位啊, 我现在就是, 已经使用中。

  10. 问一下 能否隐藏cmd窗口 ,一直开着很烦。有没有隐藏的命令???望博主赐教

    1. 好像写windows服务不是一般的麻烦。。。所以还没时间帮的上忙咯!

  11. 请问一下,能否限制php-cgi的进程数量呢?

    1. 没明白你的意思,这个软件是固定进程数量的。通过-n参数来指定。

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

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

    1. 嗯,希望看到你的测试结果,方便完善这个程序

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

    1. Widnows缺少posix thread库在这里下,http://sourceware.org/pthreads-win32/

  14. 为什么要使用 /bin/sh 去执行 cgi 程序呢?

    1. 哈,这个是fcgi,跟cgi不一样的。
      话说,我代码里用/bin/sh执行别的程序了么?

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

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

  16. 找到了,在这里可以下载 ftp://sourceware.org/pub/pthreads-win32/dll-latest/dll/x86/

    打算封装个本地环境

  17. 同一个端口 5个进程 有用?

    1. 嗯!!!多进程工作嘛。一个出问题了,还有别的备用的。

      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

        1. 能交流一下webserver如何支持fastcgi吗

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

      1. 这个已经看过,但还没有头绪,看似比HTTP协议简单点

      2. 是C的,我的WEBSERVER是powerbasic写的,

  19. 对比测试了下,你那个性能还有待提高.我的那个性能比IIS Apache 甚至比NGINX都要快.

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

  21. 你好,我用的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. 你好,应该是php-cgi进程关闭了才出现这条错误?

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

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

    1. 应该先关掉xxfpm。

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

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

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

  26. 以下问题的环境在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

  27. 虾哥,PHP5.6已经不能用了,劳驾百忙之中抽空的时候升个级吧!

    1. 不能用是什么原因呢,你可以把问题详细列在这里 😀

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

  28. 问一下怎么弄成服务。每次只有登陆后才能用。好麻烦。

  29. 感谢博主。
    window2008 nginx+php-cgi php经常莫名退出,试下您这个好不好用

  30. 怎么关掉 xxfpm 啊,没有命令啊,然后关闭进程是关不了的。。

    1. taskkill /F /IM xxfpm.exe > nul
      关掉了。。。一直在关php-cgi去了,难怪关不了

  31. 感谢博主!您的程序解决了我遇到的问题!

发表评论

评论会经过自动审核,链接请勿超过 3 个。