首頁 後端開發 php教程 來聊聊FastCgi和PHP-fpm之間有什麼瓜葛?

來聊聊FastCgi和PHP-fpm之間有什麼瓜葛?

Sep 26, 2021 pm 03:25 PM
cgi php php-fpm

#我上網查fastcgi與php-fpm的關係,查了快一週了,基本上看了個遍,真是眾說紛紜,沒一個權威的定義。

  • 網路上有的說,fastcgi是一個協議,php-fpm實作了這個協議;

  • 有的說,php-fpm是fastcgi程序的管理器,用來管理fastcgi程序的;

  • 有的說,php-fpm是php核心的一個補丁;

有的說,修改了php.ini設定檔後,沒辦法平滑重啟,所以就誕生了php-fpm;
  • 還有的說PHP-CGI是PHP自帶的FastCGI管理器,那這樣的話幹嗎又弄個php-fpm出來?
  • 首先,CGI是幹嘛的?
CGI是為了確保web server傳遞過來的資料是標準格式的,方便CGI程式的編寫者。

web server(比如說nginx)只是內容的分發者。例如,如果請求/index.html,那麼web server會去檔案系統找到這個文件,傳送給瀏覽器,這裡分發的是靜態資料。好了,如果現在請求的是/index.php,根據設定文件,nginx知道這個不是靜態文件,需要去找PHP解析器來處理,那麼他會把這個請求簡單處理後交給PHP解析器。 Nginx會傳哪些資料給PHP解析器呢? url要有吧,查詢字串也得有吧,POST資料也要有,HTTP header不能少吧,好的,CGI就是規定要傳哪些資料、以什麼樣的格式傳遞給後方處理這個請求的協定。

當web server收到/index.php這個請求後,會啟動對應的CGI程序,這裡就是PHP的解析器。接下來PHP解析器會解析php.ini文件,初始化執行環境,然後處理請求,再以規定CGI規定的格式傳回處理後的結果,退出進程。 web server再把結果回傳給瀏覽器。

好了,CGI是個協議,跟進程什麼的沒關係。

那fastcgi又是什麼呢?

Fastcgi是用來提升CGI程式效能的。
  • 提高效能,那麼CGI程式的效能問題在哪呢?

  • "PHP解析器會解析php.ini文件,初始化執行環境",就是這裡了。標準的CGI對每個請求都會執行這些步驟(不閒累啊!啟動進程很累的說!),所以處理每個時間的時間會比較長。這明顯不合理嘛!那麼Fastcgi是怎麼做的呢?首先,Fastcgi會先啟動一個master,解析設定文件,初始化執行環境,然後再啟動多個worker。當請求過來時,master會傳遞給一個worker,然後立即可以接受下一個請求。這樣就避免了重複的勞動,效率自然是高。而當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閒worker太多時,也會停掉一些,這樣就提高了性能,也節約了資源。這就是fastcgi的對流程的管理。

  • 那PHP-FPM又是什麼呢?

是實作了Fastcgi的程序,被PHP官方收了。
  1. 大家都知道,PHP的解釋器是php-cgi。 php-cgi只是個CGI程序,他自己本身只能解析請求,回傳結果,不會進程管理(皇上,臣妾真的做不到啊!)所以就出現了一些能夠調度php-cgi進程的程序,比如說由lighthttpd分離出來的spawn-fcgi。好了PHP-FPM也是這麼個東東,在長時間的發展後,逐漸得到了大家的認可(要知道,前幾年大家可是抱怨PHP-FPM穩定性太差的),也越來越流行。

好了,最後來回來上面的問題。
  1. 網路上有的說,fastcgi是一個協議,php-fpm實作了這個協定

對。
  1. 有的說,php-fpm是fastcgi行程的管理器,用來管理fastcgi行程的

對。 php-fpm的管理對像是php-cgi。但不能說php-fpm是fastcgi進程的管理器,因為前面說了fastcgi是個協議,似乎沒有這麼個行程存在,就算存在php-fpm也管理不了他(至少目前是)。
  1. 有的說,php-fpm是php核心的一個補丁###############以前是對的。因為最開始的時候php-fpm沒有包含在PHP核心裡面,要使用這個功能,需要找到與原始碼版本相同的php-fpm對內核打補丁,然後再編譯。後來PHP核心整合了PHP-FPM之後就方便多了,使用--enalbe-fpm這個編譯參數即可。 ###############有的說,修改了php.ini設定檔後,沒辦法平滑重啟,所以就誕生了php-fpm###

是的,修改php.ini之後,php-cgi進程的確是沒辦法平滑重啟的。 php-fpm對此的處理機制是新的worker用新的配置,已經存在的worker處理完手上的活就可以歇著了,透過這個機制來平滑過度。

  1. 還有的說PHP-CGI是PHP自帶的FastCGI管理器,那這樣的話幹嗎又弄個php-fpm出來?

不對。 php-cgi只是解釋PHP腳本的程式而已。

推薦學習:《PHP影片教學

#

以上是來聊聊FastCgi和PHP-fpm之間有什麼瓜葛?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 適用於 Ubuntu 和 Debian 的 PHP 8.4 安裝和升級指南 Dec 24, 2024 pm 04:42 PM

PHP 8.4 帶來了多項新功能、安全性改進和效能改進,同時棄用和刪除了大量功能。 本指南介紹如何在 Ubuntu、Debian 或其衍生版本上安裝 PHP 8.4 或升級到 PHP 8.4

我後悔之前不知道的 7 個 PHP 函數 我後悔之前不知道的 7 個 PHP 函數 Nov 13, 2024 am 09:42 AM

如果您是經驗豐富的PHP 開發人員,您可能會感覺您已經在那裡並且已經完成了。操作

如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 如何設定 Visual Studio Code (VS Code) 進行 PHP 開發 Dec 20, 2024 am 11:31 AM

Visual Studio Code,也稱為 VS Code,是一個免費的原始碼編輯器 - 或整合開發環境 (IDE) - 可用於所有主要作業系統。 VS Code 擁有大量針對多種程式語言的擴展,可以輕鬆編寫

在PHP API中說明JSON Web令牌(JWT)及其用例。 在PHP API中說明JSON Web令牌(JWT)及其用例。 Apr 05, 2025 am 12:04 AM

JWT是一種基於JSON的開放標準,用於在各方之間安全地傳輸信息,主要用於身份驗證和信息交換。 1.JWT由Header、Payload和Signature三部分組成。 2.JWT的工作原理包括生成JWT、驗證JWT和解析Payload三個步驟。 3.在PHP中使用JWT進行身份驗證時,可以生成和驗證JWT,並在高級用法中包含用戶角色和權限信息。 4.常見錯誤包括簽名驗證失敗、令牌過期和Payload過大,調試技巧包括使用調試工具和日誌記錄。 5.性能優化和最佳實踐包括使用合適的簽名算法、合理設置有效期、

您如何在PHP中解析和處理HTML/XML? 您如何在PHP中解析和處理HTML/XML? Feb 07, 2025 am 11:57 AM

本教程演示瞭如何使用PHP有效地處理XML文檔。 XML(可擴展的標記語言)是一種用於人類可讀性和機器解析的多功能文本標記語言。它通常用於數據存儲

php程序在字符串中計數元音 php程序在字符串中計數元音 Feb 07, 2025 pm 12:12 PM

字符串是由字符組成的序列,包括字母、數字和符號。本教程將學習如何使用不同的方法在PHP中計算給定字符串中元音的數量。英語中的元音是a、e、i、o、u,它們可以是大寫或小寫。 什麼是元音? 元音是代表特定語音的字母字符。英語中共有五個元音,包括大寫和小寫: a, e, i, o, u 示例 1 輸入:字符串 = "Tutorialspoint" 輸出:6 解釋 字符串 "Tutorialspoint" 中的元音是 u、o、i、a、o、i。總共有 6 個元

解釋PHP中的晚期靜態綁定(靜態::)。 解釋PHP中的晚期靜態綁定(靜態::)。 Apr 03, 2025 am 12:04 AM

靜態綁定(static::)在PHP中實現晚期靜態綁定(LSB),允許在靜態上下文中引用調用類而非定義類。 1)解析過程在運行時進行,2)在繼承關係中向上查找調用類,3)可能帶來性能開銷。

什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? 什麼是PHP魔術方法(__ -construct,__destruct,__call,__get,__ set等)並提供用例? Apr 03, 2025 am 12:03 AM

PHP的魔法方法有哪些? PHP的魔法方法包括:1.\_\_construct,用於初始化對象;2.\_\_destruct,用於清理資源;3.\_\_call,處理不存在的方法調用;4.\_\_get,實現動態屬性訪問;5.\_\_set,實現動態屬性設置。這些方法在特定情況下自動調用,提升代碼的靈活性和效率。

See all articles