fastcgi協議與php通信的簡單介紹

  • 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

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
Y448G的頭像Y448G
上一篇 2024-10-03 23:13
下一篇 2024-10-03 23:13

相關推薦

  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29
  • Python海龜代碼簡單畫圖

    本文將介紹如何使用Python的海龜庫進行簡單畫圖,並提供相關示例代碼。 一、基礎用法 使用Python的海龜庫,我們可以控制一個小海龜在窗口中移動,並利用它的「畫筆」在窗口中繪製…

    編程 2025-04-29
  • 機智雲gagent屬於哪個協議?

    機智雲gagent主要是基於MQTT協議,同時支持TCP、TLS、WebSocket等多種協議。 一、MQTT協議介紹 MQTT全稱Message Queuing Telemetr…

    編程 2025-04-29
  • 使用Netzob進行網絡協議分析

    Netzob是一款開源的網絡協議分析工具。它提供了一套完整的協議分析框架,可以支持多種數據格式的解析和可視化,方便用戶對協議數據進行分析和定製。本文將從多個方面對Netzob進行詳…

    編程 2025-04-29
  • 如何取消火車票自動搶票協議

    火車票自動搶票協議,是一種利用技術手段在系統繁忙的情況下,自動刷取並搶購火車票的行為。雖然在某些情況下能夠提高購票成功率,但是也會影響其他乘客的購票權益。因此,取消火車票自動搶票協…

    編程 2025-04-29
  • Python櫻花樹代碼簡單

    本文將對Python櫻花樹代碼進行詳細的闡述和講解,幫助讀者更好地理解該代碼的實現方法。 一、簡介 櫻花樹是一種圖形效果,它的實現方法比較簡單。Python中可以通過turtle這…

    編程 2025-04-28
  • Python大神作品:讓編程變得更加簡單

    Python作為一種高級的解釋性編程語言,一直被廣泛地運用於各個領域,從Web開發、遊戲開發到人工智能,Python都扮演着重要的角色。Python的代碼簡潔明了,易於閱讀和維護,…

    編程 2025-04-28
  • 用Python實現簡單爬蟲程序

    在當今時代,互聯網上的信息量是爆炸式增長的,其中很多信息可以被利用。對於數據分析、數據挖掘或者其他一些需要大量數據的任務,我們可以使用爬蟲技術從各個網站獲取需要的信息。而Pytho…

    編程 2025-04-28
  • 如何製作一個簡單的換裝遊戲

    本文將從以下幾個方面,為大家介紹如何製作一個簡單的換裝遊戲: 1. 遊戲需求和界面設計 2. 使用HTML、CSS和JavaScript開發遊戲 3. 實現遊戲的基本功能:拖拽交互…

    編程 2025-04-27

發表回復

登錄後才能評論