困擾已久的問題cgi、fastcgi、PHP-fpm彙總

一個模糊的概念

不管是php,python編程語言,仍是apache,nginx服務器對於cgi協議是個繞不開的話題。安裝,部署都會常常的看到,那麼它們究竟是幹什麼的,網上的答案很是的多!今天經過它們進行一波彙總,完全告別這個難關。參考:https://www.dayuzy.com/?p=476php

HTTP到cgi協議

當瀏覽器的客戶端輸入網站走http協議到了web服務器,好比apache,這個你們都很清楚。web服務器沒有處理php文件的功能,就會請求php解釋器(php-cgi.exe)。或者,不是PHP文件,好比是python文件,web服務器也會去請求python的解釋器。既然這麼多解釋器,不能沒有一個協議規定它們的標準,不然亂套了,這時候cgi協議就出來了,說白了就是apache/nginx和後端的腳本語言(php,python等)交互之間制定的協議。html

php-cgi是什麼

在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應用程序)。
以上的三個文件互不影響,我本地測試刪除兩個另一個也能用。

在命令行運行一個php文件

php-cli運行結果

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

apache調用php有三種方式,模塊、cgi、FastCgi,這些方法網上都能找到,下面說明一下原理。linux

  1. 模塊:這是apache獨有的對php支持,nginx是沒有這種方式的,經過這種方式apache就能夠直接處理php腳本了,至因而多進程、多線程要取決於apache的工做方式。參加:Apache三種工做模式介紹與配置
  2. cgi(通用網關接口):當apache有php腳本須要處理時,經過走cgi協議調用php解釋器php-cgi.exe,而且php-cgi.exe會讀取php.ini配置文件,做爲apache的子進程。這裏有個缺點:客戶端瀏覽器的請求多了,apache建立的子進程會特別多,而且每次都從新讀取php.ini配置文件。
  3. FastCgi就是爲了解決cgi的問題,制定的協議。該協議規定,php-cgi.exe我再也不作你apache的子進程了,我獨立了,這樣你輕鬆了吧!我單獨構成一個服務,這個服務規定一個master主進程,再啓用幾個worker進程。master負責對php.ini等配置文件,以及接收apache發過來的請求,分配給worker進程進行處理。這樣就構成了apache做爲客戶端,FastCgi協議程序做爲服務端。這個FastCgi協議程序就是PHP-fpm,它就是FastCgi協議的具體實現。

cgi和FastCgi是什麼

它們都是協議,FastCgi解決了cgi的一些缺點。nginx

php-cgi.exe和PHP-fpm是什麼?

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又是什麼?

PHP-fpm這個就是FastCgi進程管理器,它的概念並不模糊!它啓動服務監聽端口,經過nginx反向代理給它,而且它本身內置php解釋器。可是,可是windows上面不能使用PHP-fpmapache

對於客戶端瀏覽器而言,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

相關文章
相關標籤/搜索