It is also not language related, which is an opened extension of CGI, which is used to keep CGI running in the memory. It's well-known that loading of CGI has been the main reason of low performance.php
the main process of running FastCGI:html
php-cgi
of FastCGI.php.ini
, loading extensions and initiating all the data structures.
- Data from the article: Nginx 0.8x + PHP 5.2.13(FastCGI) is 10 times better than Apache(Edition 6)
- when 30k connection happens in parallel, 10 Nginx processes will only cost 150Mb Mem(15Mb 10), and 64 PHP-CGI will only cost about 1280Mb(20Mb 64).
php-cgi -b 127.0.0.1:9000
php.ini
, you should reboot PHP-CGI to make the new php.ini
work./usr/local/php/sbin/php-fpm [options] # options # --start: start a fastcgi process of php # --stop: force to kill a fastcgi process of php # --quit: smooth to kill a fastcgi process of php # --restart: restart a fastcgi process of php # --reload: smooth to reload php.ini # --logrotate: enable log files again
CGI(Common Gateway Interface)nginx
最初,CGI 是在 1993 年由美國國家超級電腦應用中心(NCSA)爲 NCSA HTTPd Web 服務器開發的。程序員
這個 Web 服務器使用了 UNIX shell 環境變量 來保存從 Web 服務器傳遞出去的參數,而後生成一個運行 CGI 的獨立進程。CGI的第一個實現是 Perl 寫的[1]。正則表達式
正由於這些問題,在CGI誕生後的很長一段時間,各類Web Server都仍是採用API這種強綁定的方式去支持Web開發,其中Apache的mod_php就屬於這種方式。因此後面就有大神提出了FastCGI標準。shell
FastCGI(Fast Common Gateway Interface)編程
FastCGI使用進程/線程池來處理一連串的請求。這些進程/線程由FastCGI服務器管理,而不是Web服務器。 當進來一個請求時,Web服務器把環境變量和這個頁面請求經過一個Socket長鏈接傳遞給FastCGI進程。因此FastCGI有以下的優勢:後端
void main(void)
{
int count = 0;
while(FCGI_Accept() >= 0) {
printf(「Content-type: text/html\r\n」);
printf(「\r\n」);
printf(「Hello world!\r\n」);
printf(「Request number %d.」, count++);
}
exit(0);
}
因此FastCGI一推出就幾乎得到了全部主流Web Server的支持,Apache、Lighttpd、IIS、Cherokee……bash
題主說的php-fpm就是一種FastCGI的後端實現。服務器
But,事情老是還有改進的餘地的,FastCGI這套工做模式實際上沒有什麼太大缺陷,可是有些不安分的Python程序猿以爲,FastCGI標準下寫異步的Web服務仍是不太方便,若是可以收到請求後CGI端去處理,處理完畢後經過Callback回調來返回結果,那樣豈不是很Coooool?!因此WSGI就被創造出來了:
WSGI(Web Server Gateway Interface)
Web服務器網關接口(Web Server Gateway Interface,縮寫爲WSGI)是爲Python語言定義的Web服務器和Web應用程序或框架之間的一種簡單而通用的接口。
當Web Server收到一個請求後,能夠經過Socket把環境變量和一個Callback回調函數傳給後端Web應用,Web應用在完成頁面組裝後經過Callback把內容返回給Web Server。這樣作的優勢有不少: