成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PHP基礎(chǔ)之fastcgi協(xié)議

岳光 / 1891人閱讀

摘要:請求頭部基本上是作為鍵值對傳輸,例如。他們者直接由將協(xié)議轉(zhuǎn)換為協(xié)議傳輸給進(jìn)行處理。而作為保留位,主要也是為了協(xié)議頭部能與字節(jié)對齊。

前言

閑來無事,決定整理一下最近看的一些東西,于是先寫寫fastcgi協(xié)議,此協(xié)議是cgi協(xié)議的升級(jí)版,其實(shí)就是當(dāng)年cgi太弱,導(dǎo)致動(dòng)態(tài)頁面太耗性能,所以開發(fā)了例如fastcgi協(xié)議等升級(jí)版,下面我們就來聊聊這個(gè)協(xié)議的相關(guān)內(nèi)容。

CGI協(xié)議以及Fastcgi協(xié)議的介紹 CGI協(xié)議的介紹

CGI協(xié)議的誕生是為了解決HTTP協(xié)議與編程語言之間的連接問題,從而減低動(dòng)態(tài)頁面的開發(fā)難度。這個(gè)協(xié)議避免所有的編程語言開發(fā)動(dòng)態(tài)頁面時(shí)還需要開發(fā)一套HTTP的解析庫。
那么,關(guān)于HTTP協(xié)議本身,其實(shí)就是2個(gè)部分:請求頭部請求體。請求頭部基本上是作為鍵值對傳輸,例如Date: Sat, 03 Feb 2018 00:14:03 GMT。請求體則是純數(shù)據(jù)流,用于傳輸文件等數(shù)據(jù)。所以,CGI本身也相應(yīng)提供了2中數(shù)據(jù)格式的輸入:鍵值對輸入數(shù)據(jù)流輸入。
那最初的CGI程序的輸入方式及其簡單,鍵值對數(shù)據(jù)的輸入直接利用環(huán)境變量進(jìn)行傳輸,而數(shù)據(jù)流輸入則是利用標(biāo)準(zhǔn)輸入流(stdin)進(jìn)行傳輸。
CGI程序的返回也包含了2種:正常數(shù)據(jù)輸出錯(cuò)誤數(shù)據(jù)輸出,正常數(shù)據(jù)輸出是用于輸出處理后的數(shù)據(jù)信息,主要是HTTP的響應(yīng)報(bào)文,而錯(cuò)誤數(shù)據(jù)輸出則是用于在程序解析錯(cuò)誤時(shí)返回給web服務(wù)器的錯(cuò)誤信息,以便于web服務(wù)器做響應(yīng)的處理和日志記錄功能。正常數(shù)據(jù)輸出和錯(cuò)誤數(shù)據(jù)輸出在當(dāng)時(shí)的CGI程序中也理所應(yīng)當(dāng)?shù)氖褂昧藰?biāo)準(zhǔn)輸出流stdout和標(biāo)準(zhǔn)錯(cuò)誤流stderr??芍^是十分簡約。
下面是一個(gè)簡單的CGI程序的小栗子:

#!/bin/sh

echo "Content-Type:text/html

"
echo ""
echo ""
echo "hello! This is the PATH var:"
echo $PATH

這個(gè)CGI程序主要功能就是輸出了PATH環(huán)境變量,其中會(huì)包含請求頭部的相關(guān)信息(之后補(bǔ)充結(jié)果)。

Fastcgi協(xié)議的介紹

但是CGI程序的弊端十分顯而易見:需要新的進(jìn)程進(jìn)行數(shù)據(jù)處理,數(shù)據(jù)傳輸方式無法分布式部署,使用進(jìn)程導(dǎo)致容易影響系統(tǒng)運(yùn)行,每次請求都重新加載數(shù)據(jù)耗費(fèi)性能。于是乎,Fastcgi程序就是為了解決相關(guān)問題而出現(xiàn)。
Fastcgi程序?qū)?b>CGI程序的規(guī)范都進(jìn)行了保留,并將其升級(jí),主要是將輸入和輸出的方式從標(biāo)準(zhǔn)流遷移到了socket傳輸,同時(shí),fastcgi協(xié)議也支持將cgi程序進(jìn)行守護(hù)進(jìn)程化,這樣可以提高請求的處理速度,同時(shí)提高了穩(wěn)定性。

那么,Fastcgi協(xié)議、php-fpm、Nginx三者本身是什么關(guān)系?其實(shí)就是,Nginxweb服務(wù)器,只提供HTTP協(xié)議的輸入和輸出。php-fpmFastcgi服務(wù)器,只支持Fastcgi協(xié)議的輸入和輸出。他們2者直接由NginxHTTP協(xié)議轉(zhuǎn)換為Fastcgi協(xié)議傳輸給php-fpm進(jìn)行處理。

Fastcgi協(xié)議的詳解 協(xié)議的組成

Fastcgi協(xié)議是由一段一段的數(shù)據(jù)段組成,可以想象成一個(gè)車隊(duì),每輛車裝了不同的數(shù)據(jù),但是車隊(duì)的順序是固定的。輸入時(shí)順序為:請求開始描述、請求鍵值對、請求輸入數(shù)據(jù)流。輸出時(shí)順序為:錯(cuò)誤輸出數(shù)據(jù)流、正常輸出數(shù)據(jù)流、請求結(jié)束描述。
其中鍵值對、輸入流、輸出流,錯(cuò)誤流的數(shù)據(jù)和CGI程序是一樣的,只不過是換了種傳輸方式而已。
再回到車隊(duì)的描述,每輛車的結(jié)構(gòu)也是統(tǒng)一的,在前面都有一個(gè)引擎,引擎決定了你的車是什么樣的。所以,每個(gè)數(shù)據(jù)塊都包含一個(gè)頭部信息,結(jié)構(gòu)如下:

typedef struct {
????unsigned?char?version;??// 版本號(hào)
????unsigned?char?type;?????// 記錄類型
????unsigned?char?requestIdB1;??// 記錄id高8位
????unsigned?char?requestIdB0;??// 記錄id低8位
????unsigned?char?contentLengthB1;??// 記錄內(nèi)容長度高8位
????unsigned?char?contentLengthB0;??// 記錄內(nèi)容長度低8位
????unsigned?char?paddingLength;????// 補(bǔ)齊位長度
????unsigned?char?reserved;?// 真·記錄頭部補(bǔ)齊位
} FCGI_Header;

注釋都描述的很清楚:

version為版本號(hào),當(dāng)前只有第一版本。

type作為關(guān)鍵的描述,用于描述數(shù)據(jù)的類型,例如是鍵值對類型還是數(shù)據(jù)流類型,或者是請求開始和請求結(jié)束,都是通過type進(jìn)行描述。

requestId是記錄ID,(B1代表高位,B0代表低位,下文同理),記錄ID主要避免同一個(gè)socket通道時(shí)候傳輸?shù)臄?shù)據(jù)的正確性,同時(shí)也提高了傳輸?shù)男省?/p>

ContentLength為數(shù)據(jù)內(nèi)容的長度。

paddingLength是用于數(shù)據(jù)能進(jìn)行8字節(jié)對齊,這樣對解析以及底層的IO操作性能有提示,所以paddingLength只是數(shù)據(jù)對8取余,固然不會(huì)超過7。

reserved作為保留位,主要也是為了協(xié)議頭部能與8字節(jié)對齊。

關(guān)于type的取值范圍:

#define FCGI_BEGIN_REQUEST       1
#define FCGI_ABORT_REQUEST       2
#define FCGI_END_REQUEST         3
#define FCGI_PARAMS              4
#define FCGI_STDIN               5
#define FCGI_STDOUT              6
#define FCGI_STDERR              7
#define FCGI_DATA                8
#define FCGI_GET_VALUES          9
#define FCGI_GET_VALUES_RESULT  10
#define FCGI_UNKNOWN_TYPE       11
#define FCGI_MAXTYPE (FCGI_UNKNOWN_TYPE)

我們大致按照其中的順序進(jìn)行介紹。

FCGI_BEGIN_REQUEST

請求輸入的時(shí)候,會(huì)帶有該類型的數(shù)據(jù),這樣是為了描述當(dāng)前需要Fastcgi服務(wù)器充當(dāng)?shù)慕巧约跋嚓P(guān)的設(shè)定。其中的數(shù)據(jù)結(jié)構(gòu)為:

typedef struct {
????unsigned?char?roleB1;???// 角色類型高8位
????unsigned?char?roleB0;???// 角色類型低8位
????unsigned?char?flags;????// 小紅旗
????unsigned?char?reserved[5];??// 補(bǔ)齊位
} FCGI_BeginRequestBody;

官方在升級(jí)CGI的時(shí)候,同時(shí)加入了多種角色給Fastcgi協(xié)議,其中定義為:

#define FCGI_RESPONDER 1 
#define FCGI_AUTHORIZER 2 
#define FCGI_FILTER 3

其中FCGI_RESPONDER是我們最常見的動(dòng)態(tài)語言腳本處理角色,叫做響應(yīng)器。FCGI_AUTHORIZER是用于判斷請求是否擁有訪問權(quán)限,類似于HTTP請求中的認(rèn)證功能,叫做授權(quán)器。FCGI_FILTER是用于對一些特殊的數(shù)據(jù)進(jìn)行處理并返回,包括添加數(shù)據(jù)頭部與尾部等功能,叫做過濾器(官方對其沒有過多的介紹,所以無法詳細(xì)描述)。
大多數(shù)請求我們都是使用FCGI_RESPONDER角色進(jìn)行請求傳輸,因?yàn)閯?dòng)態(tài)語言可以完全的替代其他2中角色的功能,所以授權(quán)器和過濾器的功能被大家給遺忘了。不過這不代表角色的設(shè)定是錯(cuò)誤的,角色的設(shè)定很大一部分程度上給Fastcgi協(xié)議提供了快捷擴(kuò)展的功能,保證了協(xié)議的可擴(kuò)展性。
flags則是用于設(shè)置使用傳輸時(shí)復(fù)用通道,避免每次傳輸都需要新開一個(gè)socket通道來浪費(fèi)時(shí)間和性能。

FCGI_ABORT_REQUEST

該類型主要是給web服務(wù)器提供主動(dòng)結(jié)束通道的功能,場景為當(dāng)web服務(wù)器需要盡快結(jié)束并關(guān)閉通道,則會(huì)發(fā)送該請求給Fastcgi服務(wù)器,這樣Fastcgi服務(wù)會(huì)盡快的將數(shù)據(jù)處理完并返回關(guān)閉通道。

FCGI_END_REQUEST

該類型是當(dāng)響應(yīng)數(shù)據(jù)輸出完畢后,用于描述該請求的響應(yīng)結(jié)果,類似于HTTP的響應(yīng)報(bào)文的狀態(tài)碼,數(shù)據(jù)結(jié)構(gòu)如下:

typedef struct {
????unsigned?char?appStatusB3;
????unsigned?char?appStatusB2;
????unsigned?char?appStatusB1;
????unsigned?char?appStatusB0;
????unsigned?char?protocolStatus;
????unsigned?char?reserved[3];
} FCGI_EndRequestBody;

其中appStatus類似于HTTP請求的狀態(tài)碼,主要用于描述數(shù)據(jù)處理的情況,而protocolStatus主要用于對于此次請求通道的描述,是請求正常完成還是拒絕完成等,其中的賦值范圍如下:

#define FCGI_REQUEST_COMPLETE 0
#define FCGI_CANT_MPX_CONN    1
#define FCGI_OVERLOADED       2
#define FCGI_UNKNOWN_ROLE     3

區(qū)別如下:

FCGI_REQUEST_COMPLETE:請求的正常結(jié)束。

FCGI_CANT_MPX_CONN:拒絕新請求。這發(fā)生在Web服務(wù)器通過一條線路向應(yīng)用發(fā)送并發(fā)的請求時(shí),后者被設(shè)計(jì)為每條線路每次處理一個(gè)請求。

FCGI_OVERLOADED:拒絕新請求。這發(fā)生在應(yīng)用用完某些資源時(shí),例如數(shù)據(jù)庫連接。

FCGI_UNKNOWN_ROLE:拒絕新請求。這發(fā)生在Web服務(wù)器指定了一個(gè)應(yīng)用不能識(shí)別的角色時(shí)。

但是,一般情況下,大家都只返回appStatus為0以及protocolStatus為0的數(shù)據(jù)。這其實(shí)也是由于官方對相關(guān)的描述并不充分的原因。

FCGI_PARAMS

該結(jié)果主要用于傳輸鍵值對類型數(shù)據(jù),畢竟英文翻譯叫參數(shù)。其中該類型為了節(jié)約空間提供了4類結(jié)構(gòu)體:

typedef struct {
????unsigned?char?nameLengthB0;??/* nameLengthB0? >> 7 == 0 */
????unsigned?char?valueLengthB0;?/* valueLengthB0 >> 7 == 0 */
????unsigned?char?nameData[nameLength];
????unsigned?char?valueData[valueLength];
} FCGI_NameValuePair11;
?
typedef struct {
????unsigned?char?nameLengthB0;??/* nameLengthB0? >> 7 == 0 */
????unsigned?char?valueLengthB3;?/* valueLengthB3 >> 7 == 1 */
????unsigned?char?valueLengthB2;
????unsigned?char?valueLengthB1;
????unsigned?char?valueLengthB0;
????unsigned?char?nameData[nameLength];
????unsigned?char?valueData[valueLength];
} FCGI_NameValuePair14;

typedef struct {
????unsigned?char?nameLengthB3;??/* nameLengthB3? >> 7 == 1 */
????unsigned?char?nameLengthB2;
????unsigned?char?nameLengthB1;
????unsigned?char?nameLengthB0;
????unsigned?char?valueLengthB0;?/* valueLengthB0 >> 7 == 0 */
????unsigned?char?nameData[nameLength];
????unsigned?char?valueData[valueLength];
} FCGI_NameValuePair41;
?
typedef struct {
????unsigned?char?nameLengthB3;??/* nameLengthB3? >> 7 == 1 */
????unsigned?char?nameLengthB2;
????unsigned?char?nameLengthB1;
????unsigned?char?nameLengthB0;
????unsigned?char?valueLengthB3;?/* valueLengthB3 >> 7 == 1 */
????unsigned?char?valueLengthB2;
????unsigned?char?valueLengthB1;
????unsigned?char?valueLengthB0;
????unsigned?char?nameData[nameLength];
????unsigned?char?valueData[valueLength];
} FCGI_NameValuePair44;

相對晦澀的話,我們再來看看圖片描述:

如圖所示,該類似分為4個(gè)部分:nameLengthvalueLength、nameDatavalueData,其中nameLengthvalueLength用于描述長度,有1字節(jié)和4字節(jié)的2種方案,也就構(gòu)成了上面的4種不同的結(jié)構(gòu)體。其中只需要判斷第一個(gè)字節(jié)的最高位是否為1,若為1則是用4字節(jié)描述的長度,若為0則用1字節(jié)。
其中,1字節(jié)是char型的大小,4字節(jié)是int型大小,所以十分方便解析。

數(shù)據(jù)流類型

類型中的FCGI_STDIN、FCGI_STDOUT、FCGI_STDERRFCGI_DATA都是數(shù)據(jù)流傳輸,不存在什么結(jié)構(gòu)體,內(nèi)容中只有數(shù)據(jù)信息。十分暴力,如圖所示:

FCGI_GET_VALUES

該類型主要用于查詢fastcgi服務(wù)器的相關(guān)性能參數(shù),結(jié)構(gòu)體復(fù)用了FCGI_PARAMS類型的結(jié)構(gòu)體,其中name設(shè)置為相應(yīng)的值,而value為空即可。之后由fastcgi服務(wù)返回FCGI_GET_VALUES_RESULT類型的數(shù)據(jù)并填充value即可。其中name取值類型包括:

FCGI_MAX_CONNS:此應(yīng)用程序?qū)⒔邮艿淖畲蟛l(fā)傳輸連接數(shù), e.g.?"1"?or?"10".

FCGI_MAX_REQS:此應(yīng)用程序?qū)⒔邮艿淖畲蟛l(fā)請求數(shù), e.g.?"1"?or?"50".

FCGI_MPXS_CONNS:此應(yīng)用程序?qū)⒔邮艿淖畲髲?fù)用傳輸連接數(shù).

Fastcgi協(xié)議實(shí)例
0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
0x0010:  03dc 535f 4000 4006 e5ba 7f00 0001 7f00  ..S_@.@.........
0x0020:  0001 ee2e 2328 3093 101a 95fd 1652 8018  ....#(0......R..
0x0030:  0156 01d1 0000 0101 080a 0004 4344 0004  .V..........CD..
0x0040:  4344 0101 0001 0008 0000 0001 0000 0000  CD..............
0x0050:  0000 0104 0001 037f 0100 0f1f 5343 5249  ............SCRI
0x0060:  5054 5f46 494c 454e 414d 452f 686f 6d65  PT_FILENAME/home
0x0070:  2f6d 6f62 792f 6e67 696e 782f 6874 6d6c  /moby/nginx/html
0x0080:  2f69 6e64 6578 2e70 6870 0c00 5155 4552  /index.php..QUER

... ...

0x03c0:  4745 7a68 2d43 4e2c 7a68 3b71 3d30 2e39  GEzh-CN,zh;q=0.9
0x03d0:  2c65 6e3b 713d 302e 3800 0104 0001 0000  ,en;q=0.8.......
0x03e0:  0000 0105 0001 0000 0000                 ..........

首先,0800之前是mac報(bào)文頭部的數(shù)據(jù),ee2e是ip報(bào)文頭部的數(shù)據(jù),4344之前是tcp報(bào)文的頭部,所以,0101以后,便是我們的fastcgi的數(shù)據(jù)包信息。
0101 0001 0008 0000,我們可以一一對應(yīng):version:1,type:1,requestId:1,contentLength:8,padding:0,之后就是FCGI_BEGIN_REQUEST的數(shù)據(jù)包:role:1,flags:0,說明使用的是響應(yīng)器功能。
之后再解析一下請求頭:version:1,type:4,requestId:1,contentLength:037f,padding:1,所以下面的結(jié)構(gòu)體為FCGI_PARAMS,繼續(xù)解析:nameLength:15,valueLength:31,nameData:SCRIPT_FILENAME,valueData:/home/moby/nginx/html/index.php,以此類推。

報(bào)文實(shí)例

POST請求報(bào)文

0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
0x0010:  0374 0e6d 4000 4006 2b15 7f00 0001 7f00  .t.m@.@.+.......
0x0020:  0001 d5a4 2328 3da1 e47f 4aa2 48a3 8018  ....#(=...J.H...
0x0030:  0156 0169 0000 0101 080a ffff ea15 ffff  .V.i............
0x0040:  ea15 0101 0001 0008 0000 0001 0000 0000  ................
0x0050:  0000 0104 0001 02fd 0300 0f1f 5343 5249  ............SCRI
0x0060:  5054 5f46 494c 454e 414d 452f 686f 6d65  PT_FILENAME/home
0x0070:  2f6d 6f62 792f 6e67 696e 782f 6874 6d6c  /moby/nginx/html

... ...

0x0340:  5450 5f43 4f4e 4e45 4354 494f 4e6b 6565  TP_CONNECTIONkee
0x0350:  702d 616c 6976 6500 0000 0104 0001 0000  p-alive.........
0x0360:  0000 0105 0001 000c 0400 6469 6469 3d63  ..........didi=c
0x0370:  6875 7869 6e67 0000 0000 0105 0001 0000  huxing..........
0x0380:  0000                                     ..

響應(yīng)報(bào)文:

0x0000:  0000 0000 0000 0000 0000 0000 0800 4500  ..............E.
0x0010:  05b4 30a7 4000 4006 069b 7f00 0001 7f00  ..0.@.@.........
0x0020:  0001 2328 ee28 d52b 8b2b 96bd f7d9 8018  ..#(.(.+.+......
0x0030:  0164 03a9 0000 0101 080a 0000 bb8d 0000  .d..............
0x0040:  bb8d 0106 0001 0564 0400 436f 6e74 656e  .......d..Conten
0x0050:  742d 7479 7065 3a20 7465 7874 2f68 746d  t-type:.text/htm
0x0060:  6c3b 2063 6861 7273 6574 3d55 5446 2d38  l;.charset=UTF-8
0x0070:  0d0a 0d0a 4172 7261 790a 280a 2020 2020  ....Array.(.....
0x0080:  5b55 5345 525d 203d 3e20 7777 772d 6461  [USER].=>.www-da
0x0090:  7461 0a20 2020 205b 484f 4d45 5d20 3d3e  ta.....[HOME].=>

... ...

0x0580:  3734 3430 322e 3335 3135 0a20 2020 205b  74402.3515.....[
0x0590:  5245 5155 4553 545f 5449 4d45 5d20 3d3e  REQUEST_TIME].=>
0x05a0:  2031 3531 3638 3734 3430 320a 290a 0000  .1516874402.)...
0x05b0:  0000 0103 0001 0008 0000 0000 0000 0000  ................
0x05c0:  0000                                     ..

等,實(shí)例可以自行利用tcpdump工具抓取。

總結(jié)

Fastcgi協(xié)議本身完成了對CGI協(xié)議的升級(jí),同時(shí)自身擁有一個(gè)很好的可擴(kuò)展性,但本身功能的限制導(dǎo)致了市面上很好有協(xié)議功能的所有實(shí)現(xiàn)實(shí)例。但對其進(jìn)行了解有利于對網(wǎng)絡(luò)數(shù)據(jù)的傳輸?shù)氖煜ひ约凹由钣∠蟆?/p> 小廣告

若對php/c++等方向感興趣且對滴滴出行有意向的小伙伴,可以將簡歷投送一波[email protected],福利多多。

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/28214.html

相關(guān)文章

  • PHP回顧執(zhí)行流程及相關(guān)概念

    摘要:通過,腳本層無需過多考慮執(zhí)行的具體環(huán)境,而本身則可以讓針對自己的特點(diǎn)給出特有實(shí)現(xiàn)。模式下,也只執(zhí)行一次。這幾個(gè)概念的關(guān)系如下網(wǎng)關(guān)協(xié)議,與語言無關(guān),所以與關(guān)系也不大。總結(jié)本文簡要回顧了程序的架構(gòu)和執(zhí)行流程,并對幾個(gè)容易混淆概念做了介紹。 轉(zhuǎn)載請注明文章出處:https://tlanyan.me/php-review... PHP回顧系列目錄 PHP基礎(chǔ) web請求 cookie we...

    jsdt 評論0 收藏0
  • PHP基礎(chǔ)fastcgi協(xié)議

    摘要:請求頭部基本上是作為鍵值對傳輸,例如。他們者直接由將協(xié)議轉(zhuǎn)換為協(xié)議傳輸給進(jìn)行處理。而作為保留位,主要也是為了協(xié)議頭部能與字節(jié)對齊。 前言 閑來無事,決定整理一下最近看的一些東西,于是先寫寫fastcgi協(xié)議,此協(xié)議是cgi協(xié)議的升級(jí)版,其實(shí)就是當(dāng)年cgi太弱,導(dǎo)致動(dòng)態(tài)頁面太耗性能,所以開發(fā)了例如fastcgi協(xié)議等升級(jí)版,下面我們就來聊聊這個(gè)協(xié)議的相關(guān)內(nèi)容。 CGI協(xié)議以及Fastc...

    youkede 評論0 收藏0
  • PHP 進(jìn)階路 - 深入理解 FastCGI 協(xié)議以及在 PHP 中的實(shí)現(xiàn)

    摘要:與傳統(tǒng)模式的區(qū)別之一則是服務(wù)器不是直接執(zhí)行程序了,而是通過與響應(yīng)器進(jìn)程管理器進(jìn)行交互,服務(wù)器需要將接口數(shù)據(jù)封裝在遵循協(xié)議包中發(fā)送給響應(yīng)器程序。正是由于進(jìn)程管理器是基于通信的,所以也是分布式的,服務(wù)器和響應(yīng)器服務(wù)器分開部署。 廣告 很多工程師在工作1~3年的時(shí)候最容易遇到瓶頸,不知道自己應(yīng)該學(xué)習(xí)什么,面試總是吃閉門羹。那么 PHP 后面應(yīng)該怎么學(xué)呢?安利一波我的系列直播 《PHP 進(jìn)階之...

    chavesgu 評論0 收藏0
  • PHP 進(jìn)階路 - 億級(jí) pv 網(wǎng)站架構(gòu)實(shí)戰(zhàn)性能壓榨

    摘要:業(yè)務(wù)和架構(gòu)不分家,架構(gòu)是建立在對業(yè)務(wù)的理解之上的。主鍵最好保持順序遞增,隨機(jī)主鍵會(huì)導(dǎo)致聚簇索引樹頻繁分裂,隨機(jī)增多,數(shù)據(jù)離散,性能下降。沒有索引的更新,可能會(huì)導(dǎo)致全表數(shù)據(jù)都被鎖住。 本博客并非全部原創(chuàng),其實(shí)是一個(gè)知識(shí)的歸納和匯總,里面我引用了很多網(wǎng)上、書上的內(nèi)容。也給出了相關(guān)的鏈接。 本文涉及的知識(shí)點(diǎn)比較多,大家可以根據(jù)關(guān)鍵字去搜索相關(guān)的內(nèi)容和購買相應(yīng)的書籍進(jìn)行系統(tǒng)的學(xué)習(xí)。不對的地方...

    SnaiLiu 評論0 收藏0
  • 深入理解PHP:Nginx 與 FPM 的工作機(jī)制

    摘要:要說與是如何協(xié)同工作的,首先得說和這兩個(gè)協(xié)議。之于標(biāo)準(zhǔn)的,也提供了一些增強(qiáng)功能,具體可以參考官方文檔。為了能夠使理解協(xié)議,提供了模塊來將請求映射為對應(yīng)的請求。 網(wǎng)絡(luò)上有很多關(guān)于如何配置 Nginx + FPM 的文章,但它們更多從操作的角度出發(fā),告訴我們怎么做,但卻沒有告訴我們?yōu)槭裁匆@么做,本文從 Nginx 與 FPM 的工作機(jī)制出發(fā),探討配置背后的原理,讓我們真正理解 Nginx...

    DC_er 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<