- 1、關於FastCGI、php-cgi、php-fpm的區別是什麼,各自有什麼用途,以及相互間的關係是什麼?
- 2、如何配置apache以fastcgi模式運行php
- 3、如何通俗的解釋cgi,fastcgi,php-fpm之間的關係
- 4、phpinfo的Server API為CGI/FastCGI是什麼模式
- 5、php中fastcgi和php-fpm是什麼東西
- 6、如何通俗地解釋 CGI,FastCGI,php-fpm 之間的關係
fastcgi是一個通用網關接口,用於web服務器(iis, apache)和應用程序通信。
php-cgi是php平台的cgi程序
以上兩個結合,可以使php整合在web服務中
php-fpm是一個獨立的php-fcgi管理軟件,它要整合進web服務中,需要使用代理模式
一般與nginx搭配。也可以與apache搭配
php-fpm一般不直接作為服務容器提供外網訪問,而是通過常用web容器作代理
php作為服務器端的解析程序,運行模式分很多種,fastcgi, mod_php, proxy(代理)等。
與iis搭配時一般採用fast-cgi模式,iis自帶fast-cgi引擎,配置好php參數即可
與apache搭配,在windows平台下,一般也是fast-cgi模式,在linux系統中一般是mod_php模式,把php作為一個子模塊加載
也可以配置php-fpm 然後在apache中配置代理模式
與nginx搭配,一般就是用php-fpm+代理模式了
第一步:下載安裝的文件
1. Apache 版本 httpd-2.2.21-win32-x86-no_ssl.msi
2. mod_fcgid 版本 mod_fcgid-2.3.6-win32-x86.zip
3. MySQL 版本 mysql-5.5.19-win32.msi
4. PHP 版本 php-5.3.5-nts-Win32-VC6-x86.zip
提示:
1. 建議選擇無SSL功能的Apache版本來完成開發,我們這裡使用了httpd-2.2.21-win32-x86-no_ssl.msi。
2. 建議選擇由Apache官方所提供的mod_fcgid 作為FastCGI模塊。我們這裡使用目前最新版本2.3.6。 mod_fcgid官方地址
3. Windows下安裝MySQL就選擇.msi安裝包格式,我們選擇了mysql-5.5.19-win32.msi ,雙擊根據嚮導安裝即可,簡單方便。
4. PHP我們選擇用php-5.3.5-nts-Win32-VC6-x86.zip 這個版本。這個是nts(非線程安全)版本,是針對PHP的FastCGI安裝方式。
第二步:安裝文件
1. 在要安裝的磁盤建一個文件夾。為了以後管理方便我們在D盤的根目錄下創建一個WAMP文件夾。 D:\WAMP(WAMP是 windows+apache+mysql+php的縮寫)。
2. 在WAMP文件夾下創建一個WWW文件夾,用來存放你的PHP網站程序。D:\WAMP\WWW。
3. 安裝Apache服務器,把Apache服務器安裝到 D:\WAMP\Apache 文件夾。具體Apache安裝過程可以參考文檔 Apache安裝圖解。
4. 把下載的php-5.3.5-nts-Win32-VC6-x86 解壓到 D:\WAMP\PHP 文件夾。
5. 安裝MySql數據庫,把MySQL安裝到 D:\WAMP\MySQL文件夾。具體MySQL安裝過程可以參考文檔MySQL安裝圖解。
第三步:配置 Apache
首先使用文本編輯工具(推薦 EditPlus )打開 D:\WAMP\Apache\conf\httpd.conf 文件,這個文件是Apache的配置文件,下面幾步都是在修改這個文件的內容。
要注意的是修改完 httpd.conf 文件需重新啟動Apache服務,新設置才會生效。
1. 設置監聽端口
打開 httpd.conf 文件後,找到 Listen(大概在第46行),將它後面的數字改為8080,如下:
Listen 8080
這個參數用來設置Apache服務器的監聽端口,一般默認為80。修改為8080 是為了避免和Windows 2003系統的IIS端口號衝突,如果你沒有啟用IIS,也可以使用默認的80端口號。
2. 修改網站存放目錄
我們知道Apache默認的網站存放目錄為Apache安裝目錄下的htdocs文件夾。當你更改網站存放目錄,就必須修改相應的Apache配置。
在配置文件 httpd.conf 中查找 DocumentRoot,將其修改為指向網站目錄的正確文件夾。我們這裡改為
DocumentRoot “D:/WAMP/www”
同時,查找 This should be changed to whatever you set DocumentRoot to,在它下面有行 Directoy 默認的DocumentRoot ,將其修改為你自己配置的DocumentRoot 路徑。我們這裡修改為:
Directory “D:/WAMP/www”
3. mod_fcgid 配置
我們將下載的 mod_fcgid-2.3.6-win32-x86.zip 壓縮包中的「mod_fcgid.so」文件複製到apache的「modules」目錄。
打開 httpd.conf 文件,在最後加入如下配置:
LoadModule fcgid_module modules/mod_fcgid.so
IfModule mod_fcgid.c
AddHandler fcgid-script .fcgi .php
#php.ini的存放目錄
FcgidInitialEnv PHPRC “D:/WAMP/PHP”
# 設置PHP_FCGI_MAX_REQUESTS大於或等於FcgidMaxRequestsPerProcess,防止php-cgi進程在處理完所有請求前退出
FcgidInitialEnv PHP_FCGI_MAX_REQUESTS 1000
#php-cgi每個進程的最大請求數
FcgidMaxRequestsPerProcess 1000
#php-cgi最大的進程數
FcgidMaxProcesses 5
#最大執行時間
FcgidIOTimeout 120
FcgidIdleTimeout 120
#php-cgi的路徑
FcgidWrapper “D:/WAMP/PHP/php-cgi.exe” .php
AddType application/x-httpd-php .php
/IfModule
修改DocumentRoot 路徑的配置為:
Directory “D:/WAMP/WWW”
Options Indexes FollowSymLinks ExecCGI
Order allow,deny
Allow from all
AllowOverride All
/Directory
注意:上面紅色文字部分。在option中添加一個屬性ExecCGI
4. 修改目錄首頁文件
在配置文件 httpd.conf 中查找 DirectoryIndex index.html 將其修改成:
DirectoryIndex index.html index.htm index.php
DirectoryIndex 指的是當客戶瀏覽器訪問的路徑是一個目錄時,Apache默認執行的文件。
以我們所修改的為例:當客戶瀏覽器訪問一個目錄時,Apache會去找該目錄下的index.html,如果沒有再找index.htm,還沒有再找 index.php。都找不到則默認顯示該目錄下的文件列表。參考文檔:如果防止Apache顯示文件列表
第四步:配置PHP
打開PHP安裝目錄,即D:\WAMP\PHP,我們可以看到目錄下有兩個這樣的文件 php.ini-development 和 php.ini-production,第一個是開發使用的配置文件,第二個是生產環境的配置,因為我們是在本機做開發,所以選擇前者。將php.ini-development複製一份到同目錄下,並改名為 php.ini。這個php.ini 就是當前使用的配置文件,以下幾步都是在修改這個php.ini文件的內容。要注意的是,修改php.ini文件後需重新啟動Apache服務,新設置才會生效。
1. 指定PHP擴展庫的存放目錄
在Windows下PHP的擴展庫通常以 DLL 形式存放在PHP的ext目錄中。
使用文本工具打開php.ini文件,查找extension_dir = “ext”,也就是在 On windows 下面那一行。把它前面的分號「;」去除掉,改為如下:
extension_dir = “D:/WAMP/PHP/ext”
extension_dir 表示PHP擴展庫的具體目錄,以便調用相應的DLL文件。
2. 開啟相應的擴展庫
默認情況下許多PHP的擴展庫都是關閉的,比如默認PHP不支持連接Mysql數據庫,需開啟相應的擴展庫。
這裡我們開啟一些常用的擴展庫。
查找 ; Windows Extensions(大概在941行),在它的下面是extension列表。
找到如下擴展:
;extension=php_curl.dll
;extension=php_gd2.dll
;extension=php_mbstring.dll
;extension=php_exif.dll
;extension=php_mysql.dll
;extension=php_mysqli.dll
;extension=php_pdo_mysql.dll
;extension=php_pdo_odbc.dll
;extension=php_sockets.dll
;extension=php_xmlrpc.dll
;extension=php_xsl.dll
把以上extension 前面的分號 「;」 去掉。如果你希望加載其它擴展模塊,方法相同,只要去掉前面的分號即可。
提示1:重啟Apache提示 「unable to load dynamic library……php_curl.dll」,加載php_curl.dll錯誤。解決方法是拷貝 PHP 目錄下的 libeay32.dll 和 ssleay32.dll 到 windows 目錄或 windows/system32 目錄下,只要是系統 Path 環境變量里包含的路徑就可以。如果不想拷貝,你也可以直接把 PHP 路徑放到系統 Path 環境變量里。 右擊我的電腦=屬性=高級=環境變量=系統變量里有個Path,雙擊打開,把你的PHP路徑加個分號「;」再前面( ;D:\WAMP\PHP ),添加進去就OK了。重啟Apache不再提示該錯誤。
提示2:Exif 擴展是用來顯示圖片的 exif 信息的,因為該擴展需要 mbstring.dll 支持,所以必須將 extension=php_exif.dll 這一行寫到extension=php_mbstring.dll 的後面。
提示3:如果PHP自帶的擴展庫不能滿足你的需要,你可以去 pecl.php.net 查找並下載你需要的庫。windows用戶可以去 pecl4win.php.net 或者 下載已經編譯好的DLL文件,也可以去 載PECL集合壓縮包。
提示4:很多人在找php_zip.dll,其實從php5.3開始已經集成了zip擴展,你可以用?php phpinfo() ? 找到zip擴展的說明。
3. 讓PHP支持短標籤
在 php.ini 配置文件查找 short_open_tag = Off (大概在266行)把它修改成:short_open_tag = On 讓其支持短標籤。
php的代碼一般包含在?php …. ?的標籤內,設置 short_open_tag = On 之後,可以寫成更簡潔的形式:? …. ?。
4. 配置PHP的Session功能
在使用session功能時,我們必須配置session文件在服務器上的保存目錄。我們需要為session建立一個可讀寫的目錄,這個目錄最好獨立於網站目錄之外。
這裡把目錄上建在了D:\WAMP\sessiontmp,然後在 php.ini 配置文件中找 ;session.save_path = “/tmp” (大概在1467行),去掉前面的分號「;」 ,改為如下:
session.save_path = “D:/WAMP/sessiontmp”
這個問題可以分兩個層面討論:
1. PHP 解釋器是否嵌入 Web 服務器進程內部執行
mod_php 通過嵌入 PHP 解釋器到 Apache 進程中,只能與 Apache 配合使用,而 cgi 和 fast-cgi 以獨立的進程的形式出現,只要對應的Web服務器實現 cgi 或者 fast-cgi 協議,就能夠處理 PHP 請求。
mod_php 這種嵌入的方式最大的弊端就是內存佔用大,不論是否用到 PHP 解釋器都會將其加載到內存中,典型的就是處理CSS、JS之類的靜態文件是完全沒有必要加載解釋器。
2. 單個進程處理的請求數量
mod_php 和 fast-cgi 的模式在每個進程的生命周期內能夠處理多個請求,而 cgi 的模式處理一個請求就馬上銷毀進程,在高並發的場景下 cgi 的性能非常糟糕。
綜上,如果對性能有極高的要求,可以將靜態請求和動態請求分開,這時 Nginx + php-fpm 是比較好的選擇。
PS: cgi、fastcgi 通常指 Web 服務器與解釋器通信的協議規範,而 php-fpm 是 fastcgi 協議的一個實現。
讓web服務器 ( IIS, APACHE, NGINX 等) 支持 php 方式 有 2 種,
通過模塊加載的方式, 適用於 apache
通過 CGI/fastCGI 模式, 該模式一般web服務器都是支持的
引用一段解釋
FastCGI是Web服務器和處理程序之間通信的一種協議,是CGI的一種改進方案,FastCGI像是一個常駐(long-live)型的CGI,它可以一直執行,在請求到達時不會花費時間去fork一個進程來處理(這是CGI最為人詬病的fork-and-execute模式)。
正是因為它只是一個通信協議,它還支持分佈式的運算,即 FastCGI 程序可以在網站服務器以外的主機上執行並且接受來自其它網站服務器來的請求。
首先要明白CGI是一個協議,方便程序員開發程序的,
而fastcgi是cgi的一個改良版,優化了CGI的性能,
php-fpm是實現了fastcgi的一個程序(當然,被官方收錄了).
而php-fpm是php的一種工作模式。以服務的形式接收服務器傳來的php文件,處理返回。
php一般還會以apache模塊的形式工作.
CGI是HTTP Server和一個獨立的進程之間的協議,把HTTP Request的Header設置成進程的環境變量,HTTP Request的正文設置成進程的標準輸入,而進程的標準輸出就是HTTP Response包括Header和正文。
FASTCGI是和HTTP協議類似的概念。無非就是規定了在同一個TCP連接里怎麼同時傳多個HTTP連接。這實際上導致了個問題,有個HTTP連接傳個大文件不肯讓出FASTCGI連接,在同一個FASTCGI連接里的其他HTTP連接就傻了。所以Lighttpd? 引入了 X-SENDFILE 。
php-fpm就相當於是Apache+mod_php。無非php-fpm自帶了FASTCGI Server,而Apache是HTTP Server。
那個WSGI和這個問題沒啥關係吧。WSGI這個只是Python內部的一個接口。無論你前面是FASTCGI,HTTP,SCGI,uWSGI等協議,你的FASTCGI/HTTP/SCGI/uWSGI Server都以相同的參數格式去調用一個函數,這樣你用Python寫的Web應用並不需要修改代碼,就可以運行在不同的Server後面了。無非CGI協議是進程間的,而WSGI是進程內的。
原創文章,作者:Y448G,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/126838.html