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

首頁 > 編程 > PHP > 正文

PHP內核學習 深入理解FastCGI

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

    鄭重聲明:本文版權歸原作者所有,轉載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯系我們修改或刪除,多謝。

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
    成人精品一区二区三区电影免费| 国产精品极品美女在线观看免费| 久久久久久久久久久人体| 欧美性感美女h网站在线观看免费| 九九热r在线视频精品| 亚洲福利影片在线| 91爱视频在线| 人人爽久久涩噜噜噜网站| 久久久久久国产精品美女| 亚洲人成电影网站色…| 久久成人国产精品| 国产在线视频欧美| 亚洲人成在线免费观看| 久热在线中文字幕色999舞| 秋霞av国产精品一区| 国模吧一区二区三区| 久久亚洲精品一区二区| 91精品国产91久久| 91视频国产一区| 亚洲国产精品久久精品怡红院| 亚洲网站在线观看| 亚洲www视频| 亚洲最大激情中文字幕| 欧美日韩国产在线| 亚洲人成电影网| 国产亚洲精品成人av久久ww| 亚洲国产天堂久久综合网| 亚洲国产成人爱av在线播放| 亚洲国产婷婷香蕉久久久久久| 欧美日韩美女在线观看| 国产精品99免视看9| 欧美激情国产高清| 久久噜噜噜精品国产亚洲综合| 国产成人免费av| 日韩成人中文字幕| 久久久久久久久亚洲| 亚洲男人av电影| 久久久久在线观看| 黄色成人在线播放| 精品一区二区三区四区在线| 国产精品美女免费| 欧美成人精品在线| 精品久久久久久国产91| 91黄色8090| 日韩有码片在线观看| 富二代精品短视频| 黑人巨大精品欧美一区二区三区| 亚洲女人天堂色在线7777| 国产日韩在线免费| 超碰91人人草人人干| 日韩av成人在线观看| www.精品av.com| 国产成人欧美在线观看| 欧美一级bbbbb性bbbb喷潮片| 亚洲成人网在线| 久久天天躁狠狠躁老女人| 国产丝袜一区视频在线观看| 欧美国产视频一区二区| 亚洲肉体裸体xxxx137| 亚洲系列中文字幕| 韩国精品美女www爽爽爽视频| 日韩免费在线观看视频| 欧美成人午夜激情| 亚洲九九九在线观看| 日韩av免费在线看| 日韩av片电影专区| 日韩精品中文字幕视频在线| 亚洲天堂色网站| 国产一区二区精品丝袜| 国产日韩欧美在线观看| 91精品视频观看| 国产欧美精品一区二区三区介绍| 国产成人在线播放| 欧美伊久线香蕉线新在线| 国产精品青青在线观看爽香蕉| 亚洲最大福利网站| 久久精品国产亚洲一区二区| 青青青国产精品一区二区| 欧美国产精品va在线观看| 亚洲视频在线免费看| 一区二区三区视频免费在线观看| 欧美性猛交xxxx乱大交3| 26uuu亚洲国产精品| 91亚洲精品久久久| 日本在线精品视频| 亚洲高清一二三区| 国模吧一区二区三区| 亚洲午夜小视频| 欧美亚洲激情在线| 国产啪精品视频网站| 亚洲成人激情视频| 久久777国产线看观看精品| 国产精品久久久久久久久免费看| 国产精品亚洲自拍| 欧美国产极速在线| 亚洲中国色老太| 九九热精品视频在线播放| 国产精品成熟老女人| 亚洲电影在线观看| 欧美午夜片欧美片在线观看| 国产日韩欧美日韩| 精品无人区乱码1区2区3区在线| 欧美超级免费视 在线| 日本亚洲欧洲色α| 欧美一区二区三区免费观看| 91精品久久久久久久久久久久久| 欧美视频免费在线观看| 欧美成人合集magnet| 亚洲国产欧美一区| 精品亚洲一区二区三区在线观看| 亚洲黄页视频免费观看| 欧美精品aaa| 国产精品视频在线观看| 欧美激情成人在线视频| 国产精品久久久久久久久久东京| 欧美性受xxxx黑人猛交| 亚洲国产精品字幕| 国产精品自拍偷拍视频| 国产亚洲精品va在线观看| 91综合免费在线| 69视频在线免费观看| 国产精品1区2区在线观看| 亚洲欧美日韩精品久久奇米色影视| 国产91热爆ts人妖在线| 中文字幕在线看视频国产欧美| 久久久亚洲天堂| 日韩av在线网| 亚洲第一级黄色片| 精品视频在线播放色网色视频| 91亚洲精华国产精华| 国产suv精品一区二区| 91中文精品字幕在线视频| 亚洲欧美激情四射在线日| 精品国产电影一区| 热re91久久精品国99热蜜臀| 在线成人中文字幕| 久久久久久综合网天天| 国产乱人伦真实精品视频| 国产精品最新在线观看| 福利视频导航一区| 国产激情久久久| 国产精品扒开腿做爽爽爽视频| 日韩欧美国产视频| 中文字幕亚洲欧美日韩2019| 精品国产鲁一鲁一区二区张丽| 欧美高清视频在线观看| 亚洲欧洲第一视频| 日韩久久免费电影| 欧美大尺度激情区在线播放| 亚洲国产欧美在线成人app| 日韩av不卡电影| 亚洲激情视频在线| 视频在线观看99| 久久伊人精品一区二区三区| 精品少妇v888av| 国产精品久久久91| 91亚洲精品久久久| 日韩av在线影视| 欧美一区二区视频97| 日韩中文字幕视频在线观看| 亚洲成人激情图| 亚洲一区二区三区视频| 久久精品电影网| 91精品久久久久久久久中文字幕|