php發送數據到視圖格式_PHP-FPM的相關知識的深度解釋

一、需要搞清楚幾個名詞概念

1. CGI(Common Gateway Interface,CGI)通用網關接口, 是Web 服務器運行時外部程序的規范,按CGI 編寫的程序可以擴展服務器功能。CGI 應用程序能與瀏覽器進行交互,還可通過數據API與數據庫服務器等外部數據源進行通信,從數據庫服務器中獲取數據。格式化為HTML文檔后,發送給瀏覽器,也可以將從瀏覽器獲得的數據放到數據庫中。幾乎所有服務器都支持CGI,可用任何語言編寫CGI,包括流行的C、C ++、Java、VB 和Delphi 等。所以說CGI是一個協議,不是進程。CGI的存在,可以使用戶通過瀏覽器來訪問執行在服務器上的動態程序;CGI是Web服務器與CGI程序間傳輸數據的標準;

服務器端 CGI 程序接收信息有三種途徑:環境變量、命令行和標準輸入。

命令行:<form>表單的Method=GET,向CGI 傳遞表單編碼信息是通過命令方式來進行的。

標準輸入:<form>表單的Method=POST,向CGI 傳遞表單編碼信息是通過標準輸入方式來進行的。

環境變量:表單編碼信息是通過環境變量QUERY_STRING 來傳遞。

瀏覽器傳遞數據方式:

POST:發送數據大小不受限制,環境變量CONTENT_LENGTH 存放這發送數據的長度,CGI程序檢查環境變量REQUEST_METHOD 確定是否采用了POST,決定是否使用標準輸入

GET:發送數據小于1024字節可使用

URL+?:屬于GET方式

9026ae07a9873775521bae22ce992c25.png

CGI工作機制

8ddf3b6475ecd2b97893ae35e9030b20.png

傳統的CGI程序執行過程

2. FastCGI(Fast Common Gateway Interface)快速通用網關接口,是CGI的優化升級。

FastCGI發展

傳統CGI接口方式主要的缺點是性能差,因為每次HTTP服務器遇到動態程序時需要重新啟動腳本解析器(php-cgi)來執行解析,然后結果返回給HTTP服務器。那么在處理高并發時,幾乎是不可用的。

FastCGI接口方式采用C/S結構,可以將HTTP服務器和腳本解析服務器分開,同時在腳本解析服務器上啟動一個或者多個腳本解析守護進程。當HTTP服務器每次遇到動態程序時,可以將其直接交付給FastCGI進程來執行,然后將得到的結果返回給瀏覽器。這種方式可以讓HTTP服務器專一地處理靜態請求或者將動態腳本服務器的結果返回給客戶端,這在很大程度上提高了整個應用系統的性能。

FastCGI 與傳統 CGI 模式的區別之一則是 Web 服務器不是直接執行 CGI 程序了,而是通過 socket 與 FastCGI 響應器(FastCGI 進程管理器)進行交互,Web 服務器需要將 CGI 接口數據封裝在遵循 FastCGI 協議包中發送給 FastCGI 響應器程序。正是由于 FastCGI 進程管理器是基于 socket 通信的,所以也是分布式的,Web服務器和CGI響應器服務器分開部署。

1bb2214ee43593e106f0a5f73d27dbbe.png

基于FastCGI進程管理器程序執行過程

3. PHP-CGI是PHP解釋器,它是個CGI程序,本身只能解析請求,不能管理進程。

4. PHP-FPM(FastCGI Process Manager:FastCGI進程管理器)是用來調度管理PHP-FastCGI進程的程序,在PHP5.3.3之前是php內核的一個補丁包,在后來的版本中php內核集成了php-fpm。

二、Nginx+FastCGI的工作過程

Nginx不支持對外部程序的直接調用或者解析,所有的外部程序(包括PHP)必須通過FastCGI接口來調用。FastCGI接口在Linux下是socket,(這個socket可以是文件socket,也可以是ip socket)。

為了調用CGI程序,還需要一個FastCGI的wrapper(wrapper可以理解為用于啟動另一個程序的程序),這個wrapper綁定在某個固定socket上,如端口或者文件socket。當Nginx將CGI請求發送給這個socket的時候,通過FastCGI接口,wrapper接收到請求,然后派生出一個新的線程,這個線程調用解釋器或者外部程序處理腳本并讀取返回數據;接著,wrapper再將返回的數據通過FastCGI接口,沿著固定的socket傳遞給Nginx;最后,Nginx將返回的數據發送給客戶端,這就是Nginx+FastCGI的整個工作過程。

659bd20137f6daccf86c397311ef5fdf.png

三、PHP-FPM對進程的管理

Fastcgi是一個協議,不是進程。PHP-FPM實現了這個協議,是對Fastcgi程序(php-cgi)的進程管理器。

首先,先啟一個master,解析配置文件,初始化執行環境,然后再啟動多個worker。當請求過來時,master會傳遞給一個worker,然后立即可以接受下一個請求。這樣就避免了重復的勞動,效率自然是高。而且當worker不夠用時,master可以根據配置預先啟動幾個worker等著;當然空閑worker太多時,也會停掉一些,這樣就提高了性能,也節約了資源。這就是php-fpm的對進程的管理。php-fpm的管理對象是php-cgi。

四、PHP-FPM實現平滑重啟

1. WorkerMan平滑重啟

WorkerMan分為主進程和子進程,主進程負責監控子進程,子進程負責接收客戶端的連接和連接上發來的請求數據,做相應的處理并返回數據給客戶端。當業務代碼更新時,其實我們只要更新子進程,便可以達到更新代碼的目的。

當WorkerMan主進程收到平滑重啟信號時,主進程會向其中一個子進程發送安全退出(讓對應進程處理完畢當前請求后才退出)信號,當這個進程退出后,主進程會重新創建一個新的子進程(這個子進程載入了新的PHP代碼),然后主進程再次向另外一個舊的進程發送停止命令,這樣一個進程一個進程的重啟,直到所有舊的進程全部被置換為止。

a2631d513d8b79a594baa445e5dbae8c.png

2. Nginx平滑重啟

Nginx的進程分為master主進程和work工作進程,master進程主要管理事件信號接受和分發,所有的請求處理都由work進程處理并返回結果,Nginx的平滑重啟或重載配置文件等升級,首先是向master發送重啟或重載配置文件信號,然后master告訴所有的work進程不再接受新的請求,然后master另起新的work進程,最后告訴舊的work進程可以光榮退出了。

3. PHP-FPM平滑重啟

php-fpm對此的處理機制是新的worker用新的配置,已經存在的worker處理完手上的活就可以歇著了,通過這種機制來平滑過度。

五、PHP-FPM詳解

PHP-FPM(PHP FastCGI Process Manager)意:PHP FastCGI 進程管理器,用于管理PHP 進程池的軟件,用于接受web服務器的請求。

PHP-FPM提供了更好的PHP進程管理方式,可以有效控制內存和進程、可以平滑重載PHP配置。

1. 為什么會出現php-fpm

fpm的出現是因為php-fastcgi出現,為了很好的管理php-fastcgi而實現的一個程序。

2. 什么是php-fastcgi

php-fastcgi 只是一個cgi程序,只會解析php請求,并且返回結果,不會管理(因此才出現的php-fpm)。

3. 為什么不叫php-cgi

其實在php-fastcgi出現之前是有一個php-cgi存在的,只是它的執行效率低下,因此被php-fastcgi取代。

4. fastcgi和cgi有什么區別

這區別就大了,當一個服務web-server(nginx)分發過來請求的時候,通過匹配后綴知道該請求是個動態的php請求,會把這個請求轉給php。

在cgi的年代,思想比較保守,總是一個請求過來后,去讀取php.ini里的基礎配置信息,初始化執行環境,每次都要不停的去創建一個進程,讀取配置,初始化環境,返回數據,退出進程,久而久之,啟動進程的工作變的乏味無趣特別累。

當php來到了5的時代,大家對這種工作方式特別反感,想偷懶的人就拼命的想,我可不可以讓cgi一次啟動一個主進程(master),讓他只讀取一次配置,然后在啟動多個工作進程(worker),當一個請求來的時候,通過master傳遞給worker這樣就可以避免重復勞動了。于是就產生了fastcgi。

5. fastcgi這么好,啟動的worker用完怎么辦

當worker不夠的時候,master會通過配置里的信息,動態啟動worker,等空閑的時候可以收回worker

6. 到現在還是沒明白php-fpm 是個什么東西?

就是來管理啟動一個master進程和多個worker進程的程序。

PHP-FPM 會創建一個主進程,控制何時以及如何將HTTP請求轉發給一個或多個子進程處理。PHP-FPM主進程還控制著什么時候創建(處理Web應用更多的流量)和銷毀(子進程運行時間太久或不再需要了)PHP子進程。PHP-FPM進程池中的每個進程存在的時間都比單個HTTP請求長,可以處理10、50、100、500或更多的HTTP請求。

六、PHP-FPM安裝

PHP在 5.3.3 之后已經把php-fpm并入到php的核心代碼中了。所以php-fpm不需要單獨的下載安裝。
要想php支持php-fpm,只需要在編譯php源碼的時候帶上 --enable-fpm 就可以了。

七、PHP-FPM配置

在Centos中,PHP-FPM 的主配置文件是 /etc/php7/php-fpm.conf。

指定一段時間內有指定個子進程失效了,PHP-FPM重啟:

54cbc428e8c10c35a88e8dba92fcd0a2.png

a8a4956b13dc2feccfa057442b86760d.png

801c65919440ded7fe6e4ef4833a986a.png

以上內容希望幫助到大家,很多PHPer在進階的時候總會遇到一些問題和瓶頸,業務代碼寫多了沒有方向感,不知道該從那里入手去提升,對此我整理了一些資料,包括但不限于:分布式架構、高可擴展、高性能、高并發、服務器性能調優、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql優化、shell腳本、Docker、微服務、Nginx等多個知識點高級進階干貨需要的可以免費分享給大家,需要戳下方

PHP進階架構師>>>視頻、面試文檔免費獲取?docs.qq.com
d174afaac4c7e55ceb710ae92f60d391.png

或者關注咱們下面的知乎專欄

PHP大神進階?zhuanlan.zhihu.com
29c85f22fb1065073596c99e84ef158d.png
來源:https://www.cnblogs.com/fengguozhong/articles/11803389.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/271375.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/271375.shtml
英文地址,請注明出處:http://en.pswp.cn/news/271375.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

stm32超聲波測距代碼_干貨!特斯拉Autopilot核心傳感器解讀超聲波雷達篇

加入高工智能汽車行業群(自動駕駛行業4群&#xff0c;車聯網智能座艙3群&#xff0c;智能商用車行業群)&#xff0c;加微信&#xff1a;15818636852&#xff0c;并出示名片&#xff0c;僅限智能網聯汽車零部件及OEM廠商。目前為止&#xff0c;特斯拉的Autopilot一共經歷了三代硬…

記錄

https://xclient.info/ https://www.macbl.com/ https://www.macwk.com/

進階篇-安卓系統:2.多點觸控的交互處理

1.android 觸摸事件偵聽 安卓的用戶交互方式包括兩種&#xff0c;一種是點擊交互&#xff0c;一種是觸摸交互。點擊交互就是手指按下抬起一個動作組。而觸摸交互分為按下&#xff08;down&#xff09;&#xff0c;移動&#xff08;move&#xff09;&#xff0c;抬起&#xff08…

計算機網絡:網絡設備知識筆記

網絡設備是實現計算機網絡實現用戶通信和交互信息的硬件基礎。常用的網絡設備有中繼器、網橋、路由器、集線器等。 1、網絡傳輸介質互聯設備 網絡線路和用戶節點具體銜接時&#xff0c;需要網絡傳輸介質的互聯設備。比如T型頭&#xff08;同軸電纜連接器&#xff09;、收發器、…

執行git命令時提示秘鑰權限太開放‘Permissions 0644 for ‘/Users/liuml/.ssh/id_rsa_tz‘ are too open.’

執行git命令時提示秘鑰權限太開放‘Permissions 0644 for /Users/liuml/.ssh/id_rsa_tz are too open.’ 報錯如下 這個問題是由于 權限的問題&#xff0c;需要文件設置權限&#xff1a; chmod 600 *

eclipse折疊if語句塊_Python學習日志01判斷 if 語句

1.條件判斷語句&#xff08;if語句&#xff09;在python中&#xff0c;if語句就是用來進行判斷的&#xff0c;語法如下&#xff1a;語法&#xff1a;If 條件表達式&#xff1a;代碼塊執行的流程&#xff1a;if語句在執行時&#xff0c;會先對條件表達式進行求值判斷&#xff1b…

mysql怎么可視化連接_IDEA連接MySQL可視化工具連接操作

IDEA連接MySQL可視化工具連接操作入下所示&#xff1a;填寫完成后&#xff0c;點擊測試連接&#xff0c;連接成功如圖所示點擊OK即可報告錯誤(如圖所示)&#xff1a;[08001] Could not create connection to database server. Attempted reconnect 3 times. Giving up. java.ne…

Windows下圖文詳解PHP三種運行方式(php_mod、cgi、fastcgi)

PHP能不能成功的在Apache服務器上運行&#xff0c;就看我們如何去配置PHP的運行方式。PHP運行目前為止主要有三種方式&#xff1a; a、以模塊加載的方式運行&#xff0c;初學者可能不容易理解&#xff0c;其實就是將PHP集成到Apache服務器&#xff0c;以同一個進程運行。 b、以…

計算機網絡基礎:ISO/OSI網絡體系結構知識筆記?

??作者主頁&#xff1a;IT技術分享社區 ??作者簡介&#xff1a;大家好,我是IT技術分享社區的博主&#xff0c;從事C#、Java開發九年&#xff0c;對數據庫、C#、Java、前端、運維、電腦技巧等經驗豐富。 ??個人榮譽&#xff1a; 數據庫領域優質創作者&#x1f3c6;&#x…

mac下安裝redis

官網地址&#xff1a;https://redis.io/ 二、下載完成后解壓安裝 解壓命令 tar zxvf redis-6.0.6.tar.gz 切換到redis目錄下 cd redis-6.0.6 編譯測試 sudo make test 編譯安裝 sudo make install sudo make test sudo make install

mysql having和where_淺談Mysql中where和having的區別

一、誤區&#xff1a;不要錯誤的認為having和group by 必須配合使用.二、where和having用法解析&#xff1a;1、 where和having都可以使用的場景&#xff1a;select goods_price,goods_name from goods where goods_price > 100select goods_price,goods_name from goods ha…

ds證據理論python實現_ALI模型理論以及Python實現

https://openreview.net/forum?idB1ElR4cgg模型結構和明天要發BiGAN模型一模一樣&#xff0c;但是兩篇論文的作者都是獨立完成自己的內容的。而且從寫作的風格來看emmm完全不一樣ALI跟BiGAN的設計一模一樣&#xff0c;但是就是沒有加Latent regressor。雖然在ALI中也簡要地談到…

IO操作總結

1&#xff0c;讀取文件將文件轉換為二進制流 1 InputStream in new FileInputStream("C:/test.png"); 2 byte[] photo new byte[in.available()]; 3 in.read(photo); 4 in.close(); View Code2&#xff0c;寫文件 1 Outpu…

計算機網絡基礎:網絡標準相關知識介紹

1、常見的制定網絡標準的機構 國際標準化組織、國際電信聯盟、電子工業協會、電氣和電子工程協會、因特網活動委員會 2、常見的網絡標準 2.1 電信標準 國際電信聯盟&#xff08;ITU&#xff09;1947年成為聯合國的一個組織&#xff0c;包括ITU-R、ITU-T、ITU-D組成。 ITU-R:無線…

Long類型轉為String類型

如果java返回給前端的字段有Long類型的&#xff0c;比如主鍵id&#xff0c;那么就要把這個Long類型轉為String類型才可以&#xff0c;不然前端拿到這個字段再傳回給你后端用的時候會導致精度缺失&#xff0c;也就是這個字段的值會改變&#xff0c;原因是java的Long類型是18位&a…

1-5Tomcat 目錄結構 和 web項目目錄結構

對應我的安裝路徑&#xff1a; web項目目錄結構 轉載于:https://www.cnblogs.com/huiziz/p/5671612.html

execjs執行js出現window對象未定義時的解決_10個常見的JS語言錯誤總匯

1、 Uncaught TypeError: Cannot Read Property這是 JavaScript 開發人員最常遇到的錯誤。當你讀取一個屬性或調用一個未定義對象的方法時&#xff0c;Chrome 中就會報出這樣的錯誤。導致這個錯誤發生的原因有很多&#xff0c;常見的一種情況是在渲染 UI 組件時&#xff0c;不正…

安卓logcat工具apk_backdoorapk 安卓APK后門捆綁腳本

項目地址https://github.com/dana-at-cp/backdoor-apk項目介紹backdoor-apk是一個bash寫的腳本&#xff0c;通過msfvenom生成一個android的payload&#xff0c;然后再使用apktools將payload捆綁到正常的apk文件中。使用方法rootkali:~/Android/evol-lab/BaiduBrowserRat# ./bac…

java8 supplier 接口

Supplier 接口 Supplier 接口是一個供給型的接口&#xff0c;其實&#xff0c;說白了就是一個容器&#xff0c;可以用來存儲數據&#xff0c;然后可以供其他方法使用的這么一個接口 *** Supplier接口測試&#xff0c;supplier相當一個容器或者變量&#xff0c;可以存儲值*/Tes…

mantis apache mysql_軟件測試(軟件安裝:php+mysql+apache+mantis過程遇到的問題以及解決方法)...

實驗環境&#xff1a; Windows 7 64位操作系統瀏覽器版本: Mozilla Firefox 41.0.0.5378一&#xff0e;PHP的安裝① 版本: php-5.4.45-Win32-VC9-x86安裝步驟&#xff1a;安裝將PHP安裝到 D:\PHP下(目錄可以自行更改)配置找到PHP目錄里的類似 php.ini-dist &#xff0c;…