不管是php,python編程語言,仍是apache,nginx服務器對於cgi協議是個繞不開的話題。安裝,部署都會常常的看到,那麼它們究竟是幹什麼的,網上的答案很是的多!今天經過它們進行一波彙總,完全告別這個難關。參考:https://www.dayuzy.com/?p=476php
當瀏覽器的客戶端輸入網站走http協議到了web服務器,好比apache,這個你們都很清楚。web服務器沒有處理php文件的功能,就會請求php解釋器(php-cgi.exe
)。或者,不是PHP文件,好比是python文件,web服務器也會去請求python的解釋器。既然這麼多解釋器,不能沒有一個協議規定它們的標準,不然亂套了,這時候cgi協議就出來了
,說白了就是apache/nginx
和後端的腳本語言(php,python等)交互之間制定的協議。html
在windows系統上面,安裝了php後,在安裝目錄下面有下面三個文件:python
php.exe
:命令行執行php腳本文件。php-cgi.exe
:經過CGI或FastCGI在web服務器(apache)上運行PHP時可使用的CGI可執行文件,能夠理解爲php解釋器(也有說是官方的FastCGI進程管理器,至因而什麼文章後面再分析,這裏就看成php解釋器)。php-win.exe
:用於在不使用命令行窗口的狀況下執行PHP腳本的PHP可執行文件(例如,使用Windows GUI的PHP應用程序)。以上的三個文件互不影響,我本地測試刪除兩個另一個也能用。
F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts> F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts> php F:\softwares\phpStudy\PHPTutorial\index.php Hello World #php.exe運行結果 F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts>php-cgi F:\softwares\phpStudy\PHPTutorial\index.php X-Powered-By: PHP/7.2.1 #php-cgi.exe運行結果 Content-type: text/html; charset=UTF-8 #php-cgi.exe運行結果 Hello World #php-cgi.exe運行結果 F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts>php-win F:\softwares\phpStudy\PHPTutorial\index.php #php-win.exe運行,結果是空行 F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts>
apache調用php有三種方式,模塊、cgi、FastCgi,這些方法網上都能找到,下面說明一下原理。linux
php-cgi.exe
,而且php-cgi.exe
會讀取php.ini
配置文件,做爲apache的子進程。這裏有個缺點:客戶端瀏覽器的請求多了,apache建立的子進程會特別多,而且每次都從新讀取php.ini
配置文件。php-cgi.exe
我再也不作你apache的子進程了,我獨立了,這樣你輕鬆了吧!我單獨構成一個服務,這個服務規定一個master主進程,再啓用幾個worker進程。master負責對php.ini
等配置文件,以及接收apache發過來的請求,分配給worker進程進行處理。這樣就構成了apache
做爲客戶端,FastCgi協議程序
做爲服務端。這個FastCgi協議程序
就是PHP-fpm,它就是FastCgi協議
的具體實現。它們都是協議,FastCgi解決了cgi的一些缺點。nginx
php-cgi.exe
是解釋器,也能夠看成一個簡易的cgi/FastCgi
管理器。好比在windows系統中nginx是如何與php結合的呢?linux經過php-fpm,可是windows沒有php-fpm,這個時候打開任務管理器會發現CGI/FastCGI(32位)
這個進程,nginx就是反向代理給它的。web
location ~ \.php(.*)$ { fastcgi_pass 127.0.0.1:9000; #這裏的9000端口就是``php-cgi.exe``監聽的 fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; }
咱們在命令行查看一下
php-cgi.exe
的幫助,它也是能夠進行一些簡單的配置的。
F:\softwares\phpStudy\PHPTutorial\php\php-7.2.1-nts>php-cgi -h Usage: php [-q] [-h] [-s] [-v] [-i] [-f <file>] php <file> [args...] -a Run interactively -b <address:port>|<port> Bind Path for external FASTCGI Server mode -C Do not chdir to the script's directory -c <path>|<file> Look for php.ini file in this directory -n No php.ini file will be used -d foo[=bar] Define INI entry foo with value 'bar' -e Generate extended information for debugger/profiler -f <file> Parse <file>. Implies `-q' -h This help -i PHP information -l Syntax check only (lint) -m Show compiled in modules -q Quiet-mode. Suppress HTTP Header output. -s Display colour syntax highlighted source. -v Version number -w Display source with stripped comments and whitespace. -z <file> Load Zend extension <file>. -T <count> Measure execution time of script repeated <count> times.
PHP-fpm
這個就是FastCgi進程管理器
,它的概念並不模糊!它啓動服務監聽端口,經過nginx反向代理給它,而且它本身內置php解釋器。可是,可是windows上面不能使用PHP-fpm
。apache
對於客戶端瀏覽器而言,nginx/apache
是服務端。對於PHP-fpm
而言,apache/nginx
是客戶端。編程
cgi、fastcgi是協議,是標準,是web服務器到後臺腳本語言之間的協議。
php-cgi和PHP-fpm是程序,至於php-cgi是解釋器仍是管理器,網上怎麼說的也有,而且它也能監聽端口處理web服務器代理的請求,那它就是簡單的cgi/FastCgi進程管理器
管理器吧!segmentfault
搞不清FastCgi與PHP-fpm之間是個什麼樣的關係
PHP 鏈接方式介紹以及如何攻擊 PHP-FPM
php-cgi和php-fpm有什麼關係?
Apache三種工做模式介紹與配置
php手冊:在舊的Windows系統上安裝
php-cgi和php-fpm有什麼關係?windows