轉自:http://www.nowamagic.net/librarys/veda/detail/1319php
CGI(通用網關接口),是HTTP服務器與其餘機器進行通訊的工具(一直沒搞懂),只知道它能解釋並執行PHP。nginx
FastCGI是CGI的一種,克服CGI每次都要fork一個進程加載解釋器致使性能降低的缺點,可以常駐內存,並接受FaseCGI進程管理的調度。在fastcgi出現之前,cgi不須要提早啓動,而是nginx負責啓動,沒當有請求到達nginx後,nginx本身fork一個cgi進程來處理請求。apache
PHP-CGI和PHP-FPM和spawn-cgi都是FastCGI進程管理器,監聽9000端口(能夠自定),接受來自服務器轉發過來的請求並指定一個cgi來處理。有些服務器中已經集成(apache),但有的服務器(nginx)沒有集成,須要手動配置。php-cgi是php自帶的,php-fpm做爲編譯選項加入php,spawn-cgi是通用的。服務器
1.FastCGI的工做原理:多線程
1)Web Server啓動時載入FastCGI進程管理器(PHP-CGI或者PHP-FPM或者spawn-cgi)併發
2)FastCGI進程管理器自身初始化,啓動多個CGI解釋器進程(可見多個php-cgi)並等待來自Web Server的鏈接。app
3)當客戶端請求到達Web Server時,FastCGI進程管理器選擇並鏈接到一個CGI解釋器。Web server將CGI環境變量和標準輸入發送到FastCGI子進程php-cgi。socket
4)FastCGI子進程完成處理後將標準輸出和錯誤信息從同一鏈接返回Web Server。當FastCGI子進程關閉鏈接時,請求便告處理完成。FastCGI子進程接着等待並處理來自FastCGI進程管理器(運行在Web Server中)的下一個鏈接。 在CGI模式中,php-cgi在此便退出。php-fpm
2.FastCGI的不足:工具
由於是多進程,因此比CGI多線程消耗更多的服務器內存,PHP-CGI解釋器每進程消耗7至25兆內存,將這個數字乘以50或100就是很大的內存數。
Nginx 0.8.46+PHP 5.2.14(FastCGI)服務器在3萬併發鏈接下,開啓的10個Nginx進程消耗150M內存(15M*10=150M),開啓的64個php-cgi進程消耗1280M內存(20M*64=1280M),加上系統自身消耗的內存,總共消耗不到2GB內存。若是服務器內存較小,徹底能夠只開啓25個php-cgi進程,這樣php-cgi消耗的總內存數才500M。
上面的數據摘自Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建賽過Apache十倍的Web服務器(第6版)
/usr/local/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u www-data -g www-data -f /usr/bin/php-cgi -f <fcgiapp> 指定調用FastCGI的進程的執行程序位置,根據系統上所裝的PHP的狀況具體設置 -a <addr> 綁定到地址addr -p <port> 綁定到端口port -s <path> 綁定到unix socket的路徑path -C <childs> 指定產生的FastCGI的進程數,默認爲5(僅用於PHP) -P <path> 指定產生的進程的PID文件路徑 -u和-g FastCGI使用什麼身份(-u 用戶 -g 用戶組)運行,Ubuntu下可使用www-data,其餘的根據狀況配置,如nobody、apache等
3.直接使用php-cgi的FastCGI運行方式有兩個問題:
1)若是進程崩潰,難以配置從新啓動
2)單進程的效率低
php-cgi -b 127.0.0.1:9000 //使用php自帶的php-cgi直接運行
4.使用php-fpm管理fastcgi進程
要想使用php-fpm 須要在編譯php的時候 加入--enable-fpm 像這樣 ./configure --prefix=/usr/local/php --enable-fpm php安裝完成後 fpm的配置文件位於 /usr/loca/php/etc/php-fpm.conf.deafult 將.deafult去掉 做爲php-fpm的配置文件 使用命令行 php-fpm -t來測試配置文件是否正確 php-fpm的路徑 /usr/local/php/sbin/下