亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > PHP > 正文

PHP內(nèi)核學(xué)習(xí) 深入理解FastCGI

2020-03-22 20:14:58
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  • |=-----------------------------------------------------------------------=||=------------------------=[ 深入理解FastCGI ]=--------------------------=||=-----------------------------------------------------------------------=||=--------------------------=[  by d4shman  ]=---------------------------=||=-----------------------------------------------------------------------=||=-------------------------=[  May 7, 2014  ]=---------------------------=||=-----------------------------------------------------------------------=|[目錄](méi)0x01 什么是FastCGI0x02 FastCGI的工作流程0x03 PHP中的CGI實(shí)現(xiàn)0x04 參考文獻(xiàn)0x01 什么是FastCGI    CGI全稱(chēng)是“通用網(wǎng)關(guān)接口”( Common Gateway Interface),它可以讓一個(gè)客戶(hù)端從網(wǎng)頁(yè)瀏覽器向執(zhí)行在web服務(wù)器上的程序請(qǐng)求數(shù)據(jù)。CGI描述了客戶(hù)端和這個(gè)程序之間傳遞數(shù)據(jù)的一種標(biāo)準(zhǔn)。    FastCGI是web服務(wù)器和處理程序之間通訊的一種協(xié)議, 是CGI的一種改進(jìn)方案, FastCGI像是一個(gè)常駐(long live)型的CGI, 它可以一直執(zhí)行,在請(qǐng)求到達(dá)時(shí)不會(huì)花費(fèi)時(shí)間去fork一個(gè)進(jìn)程來(lái)處理(這是CGI最為人詬病的fork-and-execute模式)。    CGI程序反復(fù)加載是CGI性能低下的主要原因,F(xiàn)astCGI將CGI解釋器進(jìn)程保持在內(nèi)存內(nèi)中,以此獲得較高的性能。同時(shí),F(xiàn)astCGI還支持分布式計(jì)算,也就是說(shuō),Web Server和FastCGI可以部署在不同的服務(wù)器上。0x02 FastCGI的工作流程    1.Web server啟動(dòng)時(shí)載入FastCGI進(jìn)程管理器(Apache Module、IIS ISAPI等)    2.FastCGI進(jìn)程管理器自身初始化,啟動(dòng)多個(gè)CGI解釋器進(jìn)程php-cgi并等待來(lái)自      Web Server的連接。    3.當(dāng)客戶(hù)端的請(qǐng)求到達(dá)Web Server時(shí),F(xiàn)astCGI選擇并連接到一個(gè)CGI解釋器。      Web server將CGIhtml' target='_blank'>環(huán)境變量和標(biāo)準(zhǔn)輸入發(fā)送到FastCGI子進(jìn)程php-cgi。    4.FastCGI子進(jìn)程完成處理后將標(biāo)準(zhǔn)輸出和錯(cuò)誤信息從同一連接返回Web Server。      php-cgi關(guān)閉本次連接并等待下次連接。	  0x03 PHP中的CGI實(shí)現(xiàn)    PHP中的CGI實(shí)現(xiàn)了FastCGI協(xié)議,是一個(gè)TCP或UDP協(xié)議的服務(wù)器接受來(lái)自Web服務(wù)器的請(qǐng)求,當(dāng)啟動(dòng)時(shí)創(chuàng)建TCP/UDP協(xié)議的服務(wù)器socket監(jiān)聽(tīng),并接受相關(guān)請(qǐng)求進(jìn)行處理。隨后就進(jìn)入了PHP的生命周期:模塊初始化,sapi初始化,處理PHP請(qǐng)求,模塊關(guān)閉,sapi關(guān)閉。以上構(gòu)成了PHP中CGI的生命周期。    以TCP為例,在TCP的服務(wù)端,一般會(huì)執(zhí)行這樣的幾個(gè)操作步驟:        1.調(diào)用socket函數(shù)創(chuàng)建一個(gè)TCP用的流式套接字    2.調(diào)用bind函數(shù)將服務(wù)器的本地地址與前面創(chuàng)建的套接字綁定    3.調(diào)用listen函數(shù)監(jiān)聽(tīng)新創(chuàng)建的套接字,等待客戶(hù)端發(fā)起的連接請(qǐng)求    4.服務(wù)器進(jìn)程調(diào)用accept函數(shù)進(jìn)入阻塞狀態(tài),知道有客戶(hù)進(jìn)程調(diào)用connect函數(shù)建      立連接    5.當(dāng)連接建立后,服務(wù)器調(diào)用read_stream函數(shù)讀取客戶(hù)端的請(qǐng)求    6.處理完數(shù)據(jù)后,服務(wù)器調(diào)用write函數(shù)向客戶(hù)端發(fā)送應(yīng)答        <!-------------- 這就是活生生的socket通信啊 --------------->         下面從PHP源碼來(lái)看這個(gè)過(guò)程:    (以下代碼我只保留了關(guān)鍵部分,完整代碼請(qǐng)自行查看PHP源碼)	    1.socket的創(chuàng)建、綁定和監(jiān)聽(tīng)(在源碼的sapi/cgi/fastcgi.c中)	    /* Create, bind socket and start listen on it */    if ((listen_socket = socket(sa.sa.sa_family, SOCK_STREAM, 0)) < 0 ||    #ifdef SO_REUSEADDR        setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR, (char*)&reuse, sizeof(reuse)) < 0 ||    #endif        bind(listen_socket, (struct sockaddr *) &sa, sock_len) < 0 ||        listen(listen_socket, backlog) < 0) {            fprintf(stderr, "Cannot bind/listen socket - [%d] %s.",errno, strerror(errno));        return -1;    }	    2.當(dāng)服務(wù)端初始化完成后,進(jìn)程調(diào)用accept函數(shù)進(jìn)入阻塞狀態(tài),在main函數(shù)中我們看到如下代碼:	    while (parent) {        do {            pid = fork();   //  fork出新的子進(jìn)程            switch (pid) {            case 0:                 parent = 0;                    /* don't catch our signals */                sigaction(SIGTERM, &old_term, 0);   //  終止信號(hào)                sigaction(SIGQUIT, &old_quit, 0);   //  終端退出符                sigaction(SIGINT,  &old_int,  0);   //  終端中斷符                break;                ...                default:                /* Fine */                running++;                break;        } while (parent && (running < children));    	/* 調(diào)用fcgi_accept_request接受請(qǐng)求 */        while (!fastcgi || fcgi_accept_request(&request) >= 0) {    		SG(server_context) = (void *) &request;    		init_request_info(TSRMLS_C);    		CG(interactive) = 0;        }    }	    3.調(diào)用read函數(shù)讀取客戶(hù)端請(qǐng)求:	    static int fcgi_read_request(fcgi_request *req)    {        fcgi_header hdr;        int len, padding;        unsigned char buf[FCGI_MAX_LENGTH+8];                req->keep = 0;        req->closed = 0;        req->in_len = 0;        req->out_hdr = NULL;        req->out_pos = req->out_buf;        req->has_env = 1;        /*調(diào)用sage_read讀取fcgi_request類(lèi)型的數(shù)據(jù)req*/        if (safe_read(req, &hdr, sizeof(fcgi_header)) != sizeof(fcgi_header) ||            hdr.version < FCGI_VERSION_1) {            return 0;        }    }        在請(qǐng)求初始化完成,讀取請(qǐng)求完畢后,就該處理請(qǐng)求的PHP文件了。 假設(shè)此次請(qǐng)求為PHP_MODE_STANDARD則會(huì)調(diào)用php_execute_script執(zhí)行PHP文件。在此函數(shù)中它先初始化此文件相關(guān)的一些內(nèi)容,然后再調(diào)用zend_execute_scripts函數(shù),對(duì)PHP文件進(jìn)行詞法分析和語(yǔ)法分析,生成中間代碼, 并執(zhí)行zend_execute函數(shù),從而執(zhí)行這些中間代碼。	    4.fastCGI處理完成	    int fcgi_finish_request(fcgi_request *req, int force_close)    {        int ret = 1;            if (req->fd >= 0) {            if (!req->closed) {                ret = fcgi_flush(req, 1);                req->closed = 1;            }            fcgi_close(req, force_close, 1);        }        return ret;    }    如上,當(dāng)socket處于打開(kāi)狀態(tài)(reg->fd >= 0),并且請(qǐng)求未關(guān)閉,則會(huì)將執(zhí)行后的結(jié)果刷到客戶(hù)端,并將請(qǐng)求的關(guān)閉設(shè)置為真。 將數(shù)據(jù)刷到客戶(hù)端的程序調(diào)用的是fcgi_flush函數(shù)。在此函數(shù)中,關(guān)鍵是在于答應(yīng)頭的構(gòu)造和寫(xiě)操作。 程序的寫(xiě)操作是調(diào)用的safe_write函數(shù),而safe_write函數(shù)中對(duì)于最終的寫(xiě)操作針對(duì)win和linux環(huán)境做了區(qū)分,在Win32下,如果是TCP連接則用send函數(shù),如果是非TCP則和非win環(huán)境一樣使用write函數(shù)。如下代碼:        static inline ssize_t safe_write(fcgi_request *req, const void *buf, size_t count)    {        int    ret;        size_t n = 0;            do {            errno = 0;        #ifdef _WIN32 /*win32環(huán)境*/            if (!req->tcp) { /*非TCP連接,調(diào)用write函數(shù)*/                ret = write(req->fd, ((char*)buf)+n, count-n);            } else {         /*TCP連接,調(diào)用send函數(shù)*/                ret = send(req->fd, ((char*)buf)+n, count-n, 0);                if (ret <= 0) {                    errno = WSAGetLastError();                }            }        #else  /*其他環(huán)境, 調(diào)用write函數(shù)*/            ret = write(req->fd, ((char*)buf)+n, count-n);        #endif            if (ret > 0) {                n += ret;            } else if (ret <= 0 && errno != 0 && errno != EINTR) {                return ret;            }        } while (n != count);        return n;    }    以上就是基于TCP連接的PHP FastCGI的實(shí)現(xiàn)過(guò)程。	0x04 參考文獻(xiàn)《深入理解PHP內(nèi)核》
    PHP編程

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評(píng)論 共有條評(píng)論
    用戶(hù)名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    在线手机中文字幕| 亚洲男人的天堂一区二区| 亚洲免费看av| 欧美性猛交xxxx乱| 国产97在线|日韩| 欧美人与性动交| 国产97免费视频| 在线观看麻豆蜜桃| 精品欧美国产一区二区三区| 免费国产成人看片在线| www在线视频| 亚洲欧美激情在线| 免费试看一区| 色呦呦呦在线观看| 91蝌蚪视频在线| 日韩一区二区三区四区在线| 九九热线有精品视频99| 香蕉视频网站入口| 毛片在线不卡| 国产一区亚洲| 亚洲一区三区在线观看| 亚洲国产精品欧美一二99| eeuss影院一区二区三区| 青青草国产成人99久久| 精品人妻一区二区三区含羞草| 久久精品欧美一区二区三区不卡| caoporm在线视频| 激情成人综合| 欧美国产不卡| 欧美日韩国产经典色站一区二区三区| 久久国产精品偷| 国产亚洲欧美日韩在线观看一区二区| 中文字幕av高清| 成人区精品一区二区婷婷| 久久精品一区| 成人一区二区免费视频| 成人免费在线一区二区三区| 日韩av片免费在线观看| 国产精品传媒在线| 色噜噜夜夜夜综合网| 亚州视频一区二区三区| 国产精品伊人色| 五月婷婷一区二区三区| 欧美一区不卡| 亚洲欧美日韩视频一区| 99国产超薄丝袜足j在线观看| 亚洲自拍小视频| 另类综合日韩欧美亚洲| 大尺度做爰床戏呻吟舒畅| 久久99精品久久久久久三级| 麻豆精品国产| 精品少妇一二三区| 国产精品美女久久福利网站| 国产porn视频| 日韩欧美黄色网址| 亚洲狠狠婷婷| 欧美一区二区三区在线看| 国产成人亚洲精品青草天美| 国产精品久久..4399| 在线亚洲观看| h视频免费看| 成人av在线网址| 99久久久久国产精品免费| 美丽的姑娘在线观看免费动漫| 日韩黄色av| 久蕉在线视频| 成人欧美一区二区三区在线观看| 国产午夜精品久久久久免费视| 欧美人与性动交α欧美精品济南到| 91麻豆精品国产91久久久| 99久久久国产精品美女| 国产精品一区二区三区四区在线观看| 国产精品一区二区久久不卡| 成人小视频免费观看| 91激情在线观看| 亚洲欧美日本国产有色| 久久久999国产精品| 在线免费观看日本欧美| 久久久久久久久亚洲精品| 欧美日韩高清在线| 无码精品视频一区二区三区| 中文一区一区三区高中清不卡免费| 国产精品v欧美精品v日韩| 亚洲免费在线精品一区| 综合精品久久久| 欧美最猛黑人xxxx黑人猛交黄| 一本色道久久综合亚洲精品婷婷| 欧美va亚洲va香蕉在线| 日韩在线观看一区| 国产裸体免费无遮挡| 先锋影音av321| v片在线观看| 91社区国产高清| 少妇bbw搡bbbb搡bbbb| 国产资源精品在线观看| 亚洲综合999| 国产日产欧美a一级在线| 欧美色图片你懂的| 自拍偷拍国产| 免费一区二区三区在线视频| 久操国产精品| 精品免费久久久久久久| 91破解版在线看| 亚洲最大的免费视频网站| 免费黄在线观看| 男人亚洲天堂| 91麻豆成人久久精品二区三区| 99久久免费国产精精品| 精品亚洲一区二区三区在线观看| 欧美高清第一页| 欧美日韩在线观看一区二区| 999国产视频| 999久久久国产999久久久| 亚州av在线播放| 亚洲精品第一国产综合野草社区| 91免费观看在线| 亚洲少妇在线| 亚洲成在人线在线播放| 四虎成人精品免费影院| 日韩在线观看高清| 亚洲国产欧美在线观看| 午夜激情视频在线播放| 91精品福利在线| 天天爱天天做天天爽| 日韩精品福利一区二区三区| 久久九九国产精品| 91无套直看片红桃在线观看| 成人永久看片免费视频天堂| 91老师国产黑色丝袜在线| 黄色成人av网| 亚洲综合成人网| 欧美a级免费视频| 亚欧黄色av| 九九久久久久99精品| 欧美怡红院视频| 国产精品xvideos88| 视频在线一区二区| 欧美一区二区在线视频| 99欧美视频| 亚洲妇女屁股眼交7| 蜜桃av.网站在线观看| 亚洲国产美女视频| xf在线a精品一区二区视频网站| 欧美午夜一区二区三区免费大片| 99久久夜色精品国产亚洲96| 国产尤物在线观看| 精品人妻无码一区二区性色| 日韩在线观看免费全集电视剧网站| 在线中文字幕资源| www.久久艹| 久久久国产精品入口麻豆| 久久久久久亚洲av无码专区| 成人福利片在线| www亚洲一区| 国内av免费观看| 男女污污视频网站| 精品人妻人人做人人爽夜夜爽| 亚洲成国产人片在线观看| 日韩国产欧美视频| 色婷婷一区二区| 99久久这里只有精品| 久久精品一区二区免费播放| 精品久久久久久一区| 高清电影在线观看免费| www.av在线视频| 欧美午夜电影在线观看| 中国美女黄色一级片| 欧美综合亚洲图片综合区| 91国在线精品国内播放| 国产精品视频观看| 超碰在线免费av| 一区二区三区中文字幕精品精品| 亚洲av无码一区二区三区dv| 欧美老女人第四色| 麻豆传媒在线免费看| 欧美精品一级| 成人va天堂| 久久高清免费观看| 欧美天堂亚洲电影院在线播放| 欧美性猛片aaaaaaa做受| 又色又爽又黄无遮挡的免费视频| 91蝌蚪在线| 亚洲成人第一网站| 日本不卡免费在线视频| 在线看黄色网| 成人不卡视频| 黄网站免费在线播放| 欧美三级超在线视频| 91精品婷婷国产综合久久蝌蚪| 天天综合网日韩| 最新不卡av| 欧美黑人激情| 免费操人视频| 老司机精品视频在线播放| 成年在线观看免费人视频| 日韩欧美的一区| 五月天久久比比资源色| 91探花福利精品国产自产在线| 波多野结衣爱爱视频| 欧美日韩一区二区区| 欧美国产乱视频| 欧美成人精品二区三区99精品| 欧美人与性动交xxⅹxx| 欧美一区二区三区喷汁尤物| 久久99国产精品久久99| 乱人伦xxxx国语对白| 日韩黄色高清视频| a级片在线免费看| 在线观看亚洲网站| 无码人妻丰满熟妇区毛片蜜桃精品| 麻豆精品新av中文字幕| 欧美激情办公室videoshd| 8x8x拔插拔插影库永久免费| 国产精品日韩在线播放| 亚洲天堂国产视频| jizz内谢中国亚洲jizz| 黑人巨大40cm重口| 日本一区二区三区在线观看| 欧美美最猛性xxxxxx| 少妇喷水在线观看| 久久久久久久网| 麻豆国产欧美日韩综合精品二区| 欧美一区二区三区人| 99精品久久久久| 亚洲一区二区三区在线免费观看| 色又黄又爽网站www久久| 久久久亚洲欧洲日产国码αv| 欧美午夜精品理论片| 亚洲国产一区视频| 久久久久久毛片| eeuss鲁片一区二区三区| 高清国语自产在线观看| 国产日产精品一区二区三区四区| 超碰成人在线观看| 亚洲高清色图| 91成人高清| 日韩欧美国产一区在线观看| 紧缚奴在线一区二区三区| 久久国产精品一区二区三区| 精品一区免费| 天天干 天天插| 亚洲影院色在线观看免费| 国产精品网站在线观看| 影音先锋男人资源站在线观看| 成人h动漫精品一区二区| 91精品国产自产| 国外视频精品毛片| 国内精品伊人久久久久av影院| 99在线看视频| 色哟哟精品丝袜一区二区| 爱爱视频网站免费| 色噜噜狠狠色综合网图区| 免费尤物视频| 在线观看欧美理论a影院| 精品国产一二三区| 午夜精品在线观看| 三区在线视频| 日韩情涩欧美日韩视频| 日韩av电影在线观看| 精品国产av无码一区二区三区| 国产在线1区| www.黄色网| 99视频国产精品| 欧美一区免费看| 五月天婷婷激情网| 国产亚洲欧洲一区高清在线观看| 午夜久久福利影院| 一本色道**综合亚洲精品蜜桃冫| 一级毛片在线视频| 91精品亚洲一区在线观看| 国产农村老头老太视频| 久久精品国产精品| 久久亚洲一区| 久久久精品视频在线观看| 国产情侣一区二区三区| 欧美日韩成人在线播放| 在线精品视频小说1| 狠狠躁夜夜躁久久躁别揉| 久久中文字幕精品| a级在线观看| 欧美精品福利| 熟妇熟女乱妇乱女网站| 久久男人天堂| 亚洲国产另类久久久精品极度| 在线观看免费视频a| 亚洲欧美日韩精品久久久久| 国产成人av电影在线观看| 日韩的一区二区| 高清在线不卡av| 久久久久青草大香线综合精品| a级片在线观看| 亚洲欧美制服第一页| 国产精品三级在线观看无码| 精品视频在线导航| 天堂99x99es久久精品免费| 国产成人久久精品一区二区三区| 日韩欧美一区二区一幕| 日韩av电影网| 色噜噜久久综合| 欧美午夜一区二区| 7777精品伊人久久久大香线蕉经典版下载| 国产精品探花在线播放| 中文在线不卡视频| 欧美日韩亚洲综合一区二区三区激情在线| 成人综合久久网| 久久一综合视频| 亚洲精品国模| 中文字幕av免费| 91视频精品| 中文岛国精品亚洲一区| 亚洲色图av在线| 成年人免费看的视频| 三上悠亚国产精品一区二区三区| 国产欧美日韩视频在线观看| 波多野结衣激情视频| 麻豆av免费在线观看| 久久艹国产精品| 欧美视频综合| 99久久人爽人人添人人澡| 免费观看又色又爽又黄的网站| ass白嫩白嫩的小美女| 一本色道婷婷久久欧美| 久热re这里精品视频在线6| 日本va欧美va瓶| 91精品国产91久久久久久一区二区| 亚洲精品五月天| 亚洲精品在线91| 日本免费三片免费观看|