摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當(dāng)收到這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的程序,這里就是的解析器。接下來(lái)解析器會(huì)解析文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,再把結(jié)果返回給瀏覽器。
CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。
FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。
PHP-CGI:是 PHP (Web Application)對(duì) Web Server 提供的 CGI 協(xié)議的接口程序。
PHP-FPM:是 PHP(Web Application)對(duì) Web Server 提供的 FastCGI 協(xié)議的接口程序,額外還提供了相對(duì)智能一些任務(wù)管理
CGI工作流程
1.如果客戶端請(qǐng)求的是 index.html,那么Web Server會(huì)去文件系統(tǒng)中找到這個(gè)文件,發(fā)送給瀏覽器,這里分發(fā)的是靜態(tài)數(shù)據(jù)。
2.當(dāng)Web Server收到 index.php 這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的 CGI 程序,這里就是PHP的解析器。接下來(lái)PHP解析器會(huì)解析php.ini文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定CGI規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,Web server再把結(jié)果返回給瀏覽器。
FastCGI工作流程
1.如果客戶端請(qǐng)求的是 index.html,那么Web Server會(huì)去文件系統(tǒng)中找到這個(gè)文件,發(fā)送給瀏覽器,這里分發(fā)的是靜態(tài)數(shù)據(jù)。
2.當(dāng)Web Server收到 index.php 這個(gè)請(qǐng)求后,FastCGI程序(FastCGI在啟動(dòng)時(shí)就初始化執(zhí)行執(zhí)行環(huán)境,每個(gè)CGI進(jìn)程池各個(gè)CGI進(jìn)程共享執(zhí)行環(huán)境)在CGI進(jìn)程池中選擇一個(gè)CGI進(jìn)程處理請(qǐng)求,再以規(guī)定CGI規(guī)定的格式返回處理后的結(jié)果,繼續(xù)等待下一個(gè)請(qǐng)求。
PHP-FPM基本實(shí)現(xiàn)
1.PHP-FPM的實(shí)現(xiàn)就是創(chuàng)建一個(gè)master進(jìn)程,在master進(jìn)程中創(chuàng)建worker pool并讓其監(jiān)聽(tīng)socket,然后fork出多個(gè)子進(jìn)程(work),這些子進(jìn)程各自accept請(qǐng)求,子進(jìn)程的處理非常簡(jiǎn)單,它在啟動(dòng)后阻塞在accept上,有請(qǐng)求到達(dá)后開(kāi)始讀取請(qǐng)求數(shù)據(jù),讀取完成后開(kāi)始處理然后再返回,在這期間是不會(huì)接收其它請(qǐng)求的,也就是說(shuō)PHP-FPM的子進(jìn)程同時(shí)只能響應(yīng)一個(gè)請(qǐng)求,只有把這個(gè)請(qǐng)求處理完成后才會(huì)accept下一個(gè)請(qǐng)求
2.PHP-FPM的master進(jìn)程與worker進(jìn)程之間不會(huì)直接進(jìn)行通信,master通過(guò)共享內(nèi)存獲取worker進(jìn)程的信息,比如worker進(jìn)程當(dāng)前狀態(tài)、已處理請(qǐng)求數(shù)等,當(dāng)master進(jìn)程要?dú)⒌粢粋€(gè)worker進(jìn)程時(shí)則通過(guò)發(fā)送信號(hào)的方式通知worker進(jìn)程。
3.PHP-FPM可以同時(shí)監(jiān)聽(tīng)多個(gè)端口,每個(gè)端口對(duì)應(yīng)一個(gè)worker pool,而每個(gè)pool下對(duì)應(yīng)多個(gè)worker進(jìn)程
Worker工作流程
1.等待請(qǐng)求: worker進(jìn)程阻塞在fcgi_accept_request()等待請(qǐng)求;
2.解析請(qǐng)求: fastcgi請(qǐng)求到達(dá)后被worker接收,然后開(kāi)始接收并解析請(qǐng)求數(shù)據(jù),直到request數(shù)據(jù)完全到達(dá);
3.請(qǐng)求初始化: 執(zhí)行php_request_startup(),此階段會(huì)調(diào)用每個(gè)擴(kuò)展的:PHP_RINIT_FUNCTION();
4.編譯、執(zhí)行: 由php_execute_script()完成PHP腳本的編譯、執(zhí)行;
5.關(guān)閉請(qǐng)求: 請(qǐng)求完成后執(zhí)行php_request_shutdown(),此階段會(huì)調(diào)用每個(gè)擴(kuò)展的:PHP_RSHUTDOWN_FUNCTION(),然后進(jìn)入步驟(1)等待下一個(gè)請(qǐng)求。
Master進(jìn)程管理
1.static: 這種方式比較簡(jiǎn)單,在啟動(dòng)時(shí)master按照pm.max_children配置fork出相應(yīng)數(shù)量的worker進(jìn)程,即worker進(jìn)程數(shù)是固定不變的
2.dynamic: 動(dòng)態(tài)進(jìn)程管理,首先在fpm啟動(dòng)時(shí)按照pm.start_servers初始化一定數(shù)量的worker,運(yùn)行期間如果master發(fā)現(xiàn)空閑worker數(shù)低于pm.min_spare_servers配置數(shù)(表示請(qǐng)求比較多,worker處理不過(guò)來(lái)了)則會(huì)fork worker進(jìn)程,但總的worker數(shù)不能超過(guò)pm.max_children,如果master發(fā)現(xiàn)空閑worker數(shù)超過(guò)了pm.max_spare_servers(表示閑著的worker太多了)則會(huì)殺掉一些worker,避免占用過(guò)多資源,master通過(guò)這4個(gè)值來(lái)控制worker數(shù)
3.ondemand: 這種方式一般很少用,在啟動(dòng)時(shí)不分配worker進(jìn)程,等到有請(qǐng)求了后再通知master進(jìn)程fork worker進(jìn)程,總的worker數(shù)不超過(guò)pm.max_children,處理完成后worker進(jìn)程不會(huì)立即退出,當(dāng)空閑時(shí)間超過(guò)pm.process_idle_timeout后再退出
PHP-FPM事件管理器
1.sp[1]管道可讀事件:這個(gè)事件是master用于處理信號(hào)的
2.fpm_pctl_perform_idle_server_maintenance_heartbeat():這是進(jìn)程管理實(shí)現(xiàn)的主要事件,master啟動(dòng)了一個(gè)定時(shí)器,每隔1s觸發(fā)一次,主要用于dynamic、ondemand模式下的worker管理,master會(huì)定時(shí)檢查各worker pool的worker進(jìn)程數(shù),通過(guò)此定時(shí)器實(shí)現(xiàn)worker數(shù)量的控制
3.fpm_pctl_heartbeat():這個(gè)事件是用于限制worker處理單個(gè)請(qǐng)求最大耗時(shí)的,php-fpm.conf中有一個(gè)request_terminate_timeout的配置項(xiàng),如果worker處理一個(gè)請(qǐng)求的總時(shí)長(zhǎng)超過(guò)了這個(gè)值那么master將會(huì)向此worker進(jìn)程發(fā)送kill -TERM信號(hào)殺掉worker進(jìn)程,此配置單位為秒,默認(rèn)值為0表示關(guān)閉此機(jī)制
4.fpm_pctl_on_socket_accept():ondemand模式下master監(jiān)聽(tīng)的新請(qǐng)求到達(dá)的事件,因?yàn)閛ndemand模式下fpm啟動(dòng)時(shí)是不會(huì)預(yù)創(chuàng)建worker的,有請(qǐng)求時(shí)才會(huì)生成子進(jìn)程,所以請(qǐng)求到達(dá)時(shí)需要通知master進(jìn)程
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/28507.html
摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當(dāng)收到這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的程序,這里就是的解析器。接下來(lái)解析器會(huì)解析文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...
摘要:是與之間數(shù)據(jù)交換的一種協(xié)議。當(dāng)收到這個(gè)請(qǐng)求后,會(huì)啟動(dòng)對(duì)應(yīng)的程序,這里就是的解析器。接下來(lái)解析器會(huì)解析文件,初始化執(zhí)行環(huán)境,然后處理請(qǐng)求,再以規(guī)定規(guī)定的格式返回處理后的結(jié)果,退出進(jìn)程,再把結(jié)果返回給瀏覽器。 CGI:是 Web Server 與 Web Application 之間數(shù)據(jù)交換的一種協(xié)議。FastCGI:同 CGI,是一種通信協(xié)議,但比 CGI 在效率上做了一些優(yōu)化。PHP-...
摘要:深入?yún)f(xié)議從功能上來(lái)講,協(xié)議已經(jīng)完全能夠解決服務(wù)器與應(yīng)用之間的數(shù)據(jù)通信問(wèn)題。消息頭信息主要的消息頭信息如下用于表示協(xié)議版本號(hào)。從服務(wù)器發(fā)送到應(yīng)用,表示中止一個(gè)處理中的請(qǐng)求。另外我們還需要明確一點(diǎn)就是服務(wù)器與進(jìn)程間通信是無(wú)序的。 本文首發(fā)于 深入剖析 Web 服務(wù)器與 PHP 應(yīng)用之間的通信機(jī)制 - 掌握 CGI 和 FastCGI 協(xié)議的運(yùn)行原理,轉(zhuǎn)載請(qǐng)注明出處! 身為一名使用 PHP ...
摘要:中專門為解決線程安全的問(wèn)題抽象出了一個(gè)線程安全資源管理器,實(shí)現(xiàn)原理比較簡(jiǎn)單既然共用資源這么困難那么就干脆不共用,各線程不再共享同一份全局變量,而是各復(fù)制一份,使用數(shù)據(jù)時(shí)各線程各取自己的副本,互不干擾。 1.線程安全資源管理器 PHP的SAPI多數(shù)是單線程環(huán)境,比如cli、fpm、cgi,每個(gè)進(jìn)程只啟動(dòng)一個(gè)主線程,這種模式下是不存在線程安全問(wèn)題的,但是也有多線程的環(huán)境,比如Apache,...
摘要:全部視頻引入讀這篇文章之前請(qǐng)先閱讀源碼學(xué)習(xí)協(xié)議我們知道,客戶端之間通信的方式如下那么,我們今天詳細(xì)解釋一下圖中的協(xié)議的部分。協(xié)議就是為了解決協(xié)議的相關(guān)問(wèn)題而出現(xiàn),是協(xié)議的升級(jí)版。在配置中指令中指定的值請(qǐng)求使用的協(xié)議,通常是或。 baiyan 全部視頻:https://segmentfault.com/a/11... 引入 讀這篇文章之前請(qǐng)先閱讀【PHP源碼學(xué)習(xí)】2019-04-09 ...
閱讀 3672·2021-09-07 09:59
閱讀 728·2019-08-29 15:12
閱讀 814·2019-08-29 11:14
閱讀 1320·2019-08-26 13:27
閱讀 2674·2019-08-26 10:38
閱讀 3143·2019-08-23 18:07
閱讀 1284·2019-08-23 14:40
閱讀 1933·2019-08-23 12:38