完美解決windows+ngnix+phpcgi自動退出的問題

php-cgi.exe在windows+nginx平臺下常常自動退出,網上搜到的大部分解決方法都是相似上面的批處理(代碼以下)文件臨時解決一下,但若是用戶在網站登陸的話,用戶就會忽然掛掉。php

@echo off
:main
set jinchengshuliang=0
set jinchengshuliangxiaxian=2
for /f %%i in ('tasklist /nh^|findstr /i /s /c:"php-cgi.exe"') do set /a jinchengshuliang+=1
 
if %jinchengshuliang% lss %jinchengshuliangxiaxian% (  
goto youwenti
) else (
goto meiwenti
) 
 
:youwenti
echo 進程丟失,如今添加5個進程
RunHiddenConsole.exe  php\php-cgi.exe -b 127.0.0.1:9000 -c php\php.ini
RunHiddenConsole.exe  php\php-cgi.exe -b 127.0.0.1:9000 -c php\php.ini
RunHiddenConsole.exe  php\php-cgi.exe -b 127.0.0.1:9000 -c php\php.ini
RunHiddenConsole.exe  php\php-cgi.exe -b 127.0.0.1:9000 -c php\php.ini
RunHiddenConsole.exe  php\php-cgi.exe -b 127.0.0.1:9000 -c php\php.ini
ping 127.1 -n 8
goto main
 
:meiwenti
echo 正常運行中!
ping 127.1 -n 8
goto main

最好的解決辦法是用windows下的php-cgi進程管理器,該進程管理器須要用到pthreadGC2.dll。源碼和編譯文件見本文下載地址。經測試,支持Win32和Linux-x86平臺。對於用php的人,有了這個東西來維護必定數量的進程,就能制服常常崩潰退出的php-cgi啦!linux

下載地址:http://download.csdn.net/download/mlm588/10226527nginx

如下是xxfpm進程管理器的操做參數:windows

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,算是寫得比較標準的,可是代碼也不短。bash

使用例子:測試

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

維護進程原理:.net

  Windows上使用CreateProcess建立進程,使用Wait For Single Object等待進程結束;Linux上使用fork和execl建立進程,使用waitpid等待進程結束。Linux的版本多了在建立子進程的時候能夠設置進程限制,可以以受限用戶方式來運行。code

  當進程管理器被關閉的時候,它所建立的全部子進程也必須被關閉。Windows上使用JobObject這個東西來把子進程與管理器的進程產生關聯,感謝iceboy提供的資料!Linux上經過捕捉關閉信號,而後給全部子進程發送SIGTERM來結束子進程。詳見附件源代碼。orm

啓動php進程:

RunHiddenConsole D:\php5\xxfpm\bin\xxfpm.exe "d:/php5/php-cgi.exe -c d:/php5/php.ini" -n 5 -i 127.0.0.1 -p 9000

中止php進程:

echo Stopping PHP FastCGI...
taskkill /F /IM php-cgi.exe > nul
taskkill /F /IM xxfpm.exe > nul

RunHiddenConsole 下載地址:http://download.csdn.net/download/mlm588/10226537

相關文章
相關標籤/搜索