国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁 > 編程 > 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編程

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

  • 發表評論 共有條評論
    用戶名: 密碼:
    驗證碼: 匿名發表
    国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
    91av资源在线| eeuss影院www在线观看| 免费黄色网页在线观看| 人人澡人人爽| 欧美视频免费一区二区三区| 久热中文字幕精品视频在线| 久草网在线视频| 国产精品伦一区二区三区级视频频| 国产三级做爰在线观看| 伊人222成人综合网| 免费a在线看| 91www在线观看| 青青草原国产在线观看| 国产一级性片| 开心婷婷激情五月| 精品欧美不卡一区二区在线观看| 亚洲wwwwww| 国产精美视频| 国产中文字幕网| 国产精品久久久精品a级小说| 日本成人在线播放| 国产黄色网页| 国产精品外围在线观看| eeuss影院在线观看| 国产精品剧情一区二区三区 | 日本久久网站| 国产porn在线| 中文字幕日本在线观看| 四虎网站在线观看| 亚洲第一区视频| 69堂视频在线观看国产| 国产系列电影在线播放网址| www.操操操| av网站在线播放| 99re热视频在线| 2018中文字幕在线| 国产人成在线观看| 国产网站免费看| 国产一级粉嫩xxxx| 最新国产在线| 国产不卡精品一区二区三区| 国产激情99| √天堂资源中文www| 18av在线视频| 亚洲精品少妇久久久久久| 精品日韩av| 在线āv视频| 精品视频麻豆入口| 在线视频福利| 日本视频二区| 国产美女在线观看| 精品无人区乱码1区2区3区免费| 精品美女视频在线观看免费软件| 在线免费观看你懂的| 欧美婷婷久久五月精品三区| 天堂资源最新版在线视频观看免费网| 国产毛片毛片毛片| 国产黄色一级片| eeuss影院网站免费观看| 国内自拍视频在线观看| 国产三级香港三韩国三级| 99热免费在线| 久热免费在线视频| 国产欧美日韩第一页| 精品麻豆视频| 国产毛片毛片| 伊人影院在线视频| 丁香六月婷婷| 在线视频xx| 国产一二三在线观看| av在线free| 国产精品久久久高清免费| 热99在线观看| 精品一区二区三区在线成人| 超碰在线免费播放| 在线成人一区| 国产视频xxx| 蜜桃视频网站在线| 中文av字幕| 国产精品欧美韩国日本久久| 久久99精品久久久久久野外| 亚洲天堂久久久| 综合蜜桃精品| 国产剧情在线一区| 福利视频网址导航| www.操.com| 精品剧情v国产在线观看| 国产素人视频在线观看| 激情丁香婷婷| 九九视频在线播放| 久久国产情侣| 日本福利在线| 亚洲精品影院在线| 91午夜视频| 在线欧美一级视频| 亚洲图区综合| 四虎www视频| 青青草在线视频免费观看| 精品176二区| 在线中文字幕观看| 四虎成人精品在永久在线观看| 国产黄色片在线观看| 国产女主播在线| 国产videos| 日韩中文字幕久久久经典网| 麻豆视频在线观看免费网站| 麻豆av电影在线观看| 欧美96在线| 免费99热在线观看| 国产理论片免费观看| 国产区在线看| 亚洲午夜久久久久中文字幕| 九色成人在线| 伊人免费视频| 久久一本精品| 69久久久久| 久热精品免费视频| 国产黄色免费在线观看| 欧美日韩亚洲第一页| 最新av中文字幕| 2019中文字幕在线视频| www.操操操| 国产亚洲依依| 日韩中文字幕久久久经典网| 丁香婷婷在线观看| 永久免费网站在线| 五月天丁香在线| baoyu777.永久免费视频| 日本中文字幕在线视频| 国产娇喘精品一区二区三区图片| 97在线超碰| 国产一级在线观看| 麻豆精品传媒视频观看| 中文字幕av在线| 国产午夜视频| 久艹在线视频| eeuss影院www在线观看| 久草福利资源在线视频| 91高清国产| 中文字幕一区免费| 男人操女人免费网站| 97在线免费| 国产激情99| 国产激情视频网址| 国产区视频在线播放| 午夜av在线免费观看| 丁香花高清视频完整版在线观看| 四虎影院成人| 一二三四区在线观看| 国产黄色免费| 国产视频三区| 国产精品入口免费麻豆| 激情丁香婷婷| 交视频在线观看国产| 人人在线视频| 欧美xxxx黑人又粗又长| 欧美人成在线观看网站高清| www免费在线观看| www.超级碰| 日本欧美在线视频免费观看| 在线免费观看你懂的| 精品电影在线| 天天噜天天色| 久草网在线视频| 最新中文字幕av专区| 国产区卡一卡二卡三乱码免费| 国产精品99999| 国产二级片在线| 在线免费观看高清视频色| 亚洲videos| 国产精选在线视频拍拍拍| 国产视频一二| 亚洲成人av在线影院| 久久er视频| 91在线高清| 免费三级毛片| 国产青青草在线| 一本大道香蕉8中文在线视频| 亚洲网站一区| **三级三级97片毛片| 亚洲精品在线视频免费| 男女羞羞视频在线观看| 成年人在线观看| 国产porn在线| 国产专区在线播放| 国产99在线|亚洲| 国产中文字幕网| 亚洲精品视频区| 国产亚洲依依| 开心激情五月婷婷| 精品国产美女福利到在线不卡| 青青久在线视频免费观看| 国产精品777一区二区| 开心快乐六月丁香婷婷| 在线一二三区| 国产丝袜在线观看视频| 狠狠操视频网站| 夜夜操天天干| 国产传媒在线播放| 最新国产在线精品91尤物|