中文字幕在线一区二区在线,久久久精品免费观看国产,无码日日模日日碰夜夜爽,天堂av在线最新版在线,日韩美精品无码一本二本三本,麻豆精品三级国产国语,精品无码AⅤ片,国产区在线观看视频

      php內(nèi)核知識解讀

      時間:2024-09-06 02:08:43 PHP 我要投稿
      • 相關(guān)推薦

      php內(nèi)核知識解讀

        在上篇文章給大家介紹了深入了解PHP內(nèi)核(一),相信大家通過本文多多少少都學到些知識吧,關(guān)于php內(nèi)核知識繼續(xù)關(guān)注本篇文章。

      php內(nèi)核知識解讀

        SAPI是Server Application Programming Interface(服務(wù)器應(yīng)用編程接口)的縮寫。PHP通過SAPI提供了一組接口,供應(yīng)用和PHP內(nèi)核之間進行數(shù)據(jù)交互。

        簡單的講,就像函數(shù)的輸入和輸出一樣,我們通過Linux命令行執(zhí)行一段PHP代碼,本質(zhì)是Linux的Shell通過PHP的SAPI傳入一組參數(shù),Zend引擎執(zhí)行后,返回給shell,由shell顯示出來的過程。同樣的,通過Apache調(diào)用PHP,通過Web服務(wù)器給SAPI傳入數(shù)據(jù),Zend引擎執(zhí)行后,返回給Apache,由Apache顯示在頁面上。

        圖1. PHP架構(gòu)圖

        PHP提供很多種形式的接口,包括apache、apache2filter、apache2handler、caudium、cgi 、cgi-fcgi、cli、cli-server、continuity、embed、isapi、litespeed、milter、nsapi、phttpd pi3web、roxen、thttpd、tux和webjames。但是常用的只有5種形式,CLI/CGI(命令行)、Multiprocess(多進程)、Multithreaded(多線程)、FastCGI和Embedded(內(nèi)嵌)。

        PHP提供了一個函數(shù)查看當前SAPI接口類型:

        復(fù)制代碼 代碼如下:

        string php_sapi_name ( void )

        PHP的運行和加載

        無論使用哪種SAPI,在PHP執(zhí)行腳本前后,都包含一系列事件:Module的Init(MINT)和Shutdown(MSHUTDOWN),Request 的Init(RINT)和Shutdown(RSHUTDOWN)。 第一階段是PHP模塊初始化階段(MINT),可以初始化擴展內(nèi)部變量、分配資源和注冊資源處理器,在整個PHP實例生命周期內(nèi),該過程只執(zhí)行一次。

        什么是PHP模塊?通過上面的PHP架構(gòu)圖,在PHP中可以使用get_loaded_extensions 函數(shù)來查看所有編譯并加載的模塊/擴展,相當于CLI模式下的php -m。

        以PHP的Memcached擴展源代碼為例:

        PHP_MINIT_FUNCTION(memcached) { zend_class_entry ce; memcpy(&memcached_object_handlers,zend_get_std_object_handlers(), sizeof(zend_object_handlers)); memcached_object_handlers.clone_obj = NULL; /* 執(zhí)行了一些類似的初始化操作 */ return SUCCESS; }

        第二階段是請求初始化階段(RINT),在模塊初始化并激活后,會創(chuàng)建PHP運行環(huán)境,同時調(diào)用所有模塊注冊的RINT函數(shù),調(diào)用每個擴展的請求初始化函數(shù) ,設(shè)定特定的環(huán)境變量、分配資源或執(zhí)行其他任務(wù),如審核。

        PHP_RINIT_FUNCTION(memcached) { /* 執(zhí)行一些關(guān)于請求的初始化 */ return SUCCESS; }

        第三階段,請求處理完成后,會調(diào)用PHP_RSHUTDOWN_FUNCTION進行回收,這是每個擴展的請求關(guān)閉函數(shù),執(zhí)行最后的清理工作。Zend引擎執(zhí)行清理過程、垃圾收集、對之前的請求期間用到的每個變量執(zhí)行unset。請求完成可能是執(zhí)行到腳本完成,也可能是調(diào)用die()或exit()函數(shù)完成

        第四階段,當PHP生命周期結(jié)束時候,PHP_MSHUTDOWN_FUNCTION對模塊進行回收處理,這是每個擴展的模塊關(guān)閉函數(shù),用于關(guān)閉自己的內(nèi)核子系統(tǒng)。

        PHP_MSHUTDOWN_FUNCTION(memcached) { /* 執(zhí)行關(guān)于模塊的銷毀工作 */ UNREGISTER_INI_ENTRIES(); return SUCCESS; }

        常見的運行模式

        常見的SAPI模式有五種:

        CLI和CGI模式(單進程模式)

        多進程模式

        多線程模式

        FastCGI模式

        嵌入式

        1. CLI/CGI模式

        CLI和CGI都屬于單進程模式,PHP的生命周期在一次請求中完成。也就是說每次執(zhí)行PHP腳本,都會執(zhí)行第二部分講的四個INT和Shutdown事件。

        圖2. CGI/CLI生命周期

        2. 多進程模式(Multiprocess)

        多進程模式可以將PHP內(nèi)置到Web Server中,PHP可以編譯成Apache下的prefork MPM模式和APXS模塊,當Apache啟動后,會fork很多子進程,每個子進程擁有自己獨立的進程地址空間。

        圖3. 多進程模式生命周期

        在一個子進程中,PHP的生命周期是調(diào)用MINT啟動后,執(zhí)行多次請求(RINT/RSHUTDOWN),在Apache關(guān)閉或進程結(jié)束后,才會調(diào)用MSHUTDOWN進行回收階段。

        圖4. 多進程的生命周期

        多進程模型中,每個子進程都是獨立運行,沒有代碼和數(shù)據(jù)共享,因此一個子進程終止退出和重新生成,不會影響其他子進程的穩(wěn)定。

        3. 多線程模式(Multithreaded)

        Apache2的Worker MPM采用了多線程模型,在一個進程下創(chuàng)建多個線程,在同一個進程地址空間執(zhí)行。

        圖5. 多線程生命周期

        4. FastCGI模式

        在我們用的Nginx+PHP-FPM用的就是FastCGI模式,F(xiàn)astcgi是一種特殊的CGI模式,是一種常駐進程類型的CGI,運行后可以Fork多個進程,不用花費時間動態(tài)的Fork子進程,也不需要每次請求都調(diào)用MINT/MSHUTDOWN。PHP通過PHP-FPM來管理和調(diào)度FastCGI的進程池。Nginx和PHP-FPM通過本地的TCP Socket和Unix Socket 進行通信。

        圖6. FastCGI模式生命周期

        PHP-FPM進程管理器自身初始化,啟動多個CGI解釋器進程等待來自Nginx的請求。當客戶端請求達到PHP-FPM,管理器選擇到一個CGI進程進行處理,Nginx將CGI環(huán)境變量和標準輸入發(fā)送到一個PHP-CIG子進程。PHP-CGI子進程處理完成后,將標準輸出和錯誤信息返回給Nginx,當PHP-CGI子進程關(guān)閉連接時,請求處理完成。PHP-CGI子進程等待著下一個連接。

        可以想象CGI的系統(tǒng)開銷有多大。每一個Web 請求PHP都必須重新解析php.ini、載入全部擴展并始化全部數(shù)據(jù)結(jié)構(gòu)。使用FastCGI,所有這些都只在進程啟動時發(fā)生一次。另外,對于數(shù)據(jù)庫和Memcache的持續(xù)連接可以工作。

        5. 內(nèi)嵌模式(Embedded)

        Embed SAPI是一種特殊的SAPI,允許在C/C++語言中調(diào)用PHP提供的函數(shù)。這種SAPI和CLI模式一樣,按照Module Init => Request Init => Request => Request Shutdown => Module Shutdown的模式運行。

        Embed SAPI可以調(diào)用PHP豐富的類庫,也可以實現(xiàn)高級玩法,比如可以查看PHP的OPCODE(PHP執(zhí)行的中間碼,Zend引擎的指令,由PHP代碼生成)。

        詳細請見: /article/74641.htm

        SAPI的運行機制

        我們以CGI為例,看一下SAPI的運行機制。

        static sapi_module_struct cgi_sapi_module = { "cgi-fcgi", /* 輸出給php_info()使用 */ "CGI/FastCGI", /* pretty name */ php_cgi_startup, /* startup 當SAPI初始化時,首先會調(diào)用該函數(shù) */ php_module_shutdown_wrapper, /* shutdown 關(guān)閉函數(shù)包裝器,它用來釋放所有的SAPI的數(shù)據(jù)結(jié)構(gòu)、內(nèi)存等,調(diào)用php_module_shutdown */ sapi_cgi_activate, /* activate 此函數(shù)會在每個請求開始時調(diào)用,它會做初始化,資源分配 */ sapi_cgi_deactivate, /* deactivate 此函數(shù)會在每個請求結(jié)束時調(diào)用,它用來確保所有的數(shù)據(jù)都得到釋放 */ sapi_cgi_ub_write, /* unbuffered write 不緩存的寫操作(unbuffered write),它是用來向SAPI外部輸出數(shù)據(jù) */ sapi_cgi_flush, /* flush 刷新輸出,在CLI模式下通過使用C語言的庫函數(shù)fflush實現(xiàn)*/ NULL, /* get uid */ sapi_cgi_getenv, /* getenv 根據(jù)name查找環(huán)境變量 */ php_error, /* error handler 注冊錯誤處理函數(shù) */ NULL, /* header handler PHP調(diào)用header()時候被調(diào)用 */ sapi_cgi_send_headers, /* send headers handler 發(fā)送頭部信息*/ NULL, /* send header handler 發(fā)送一個單獨的頭部信息 */ sapi_cgi_read_post, /* read POST data 當請求的方法是POST時,程序獲取POST數(shù)據(jù),寫入$_POST數(shù)組 */ sapi_cgi_read_cookies, /* read Cookies 獲取Cookie值 */ sapi_cgi_register_variables, /* register server variables 給$_SERVER添加環(huán)境變量 */ sapi_cgi_log_message, /* Log message 輸出錯誤信息 */ NULL, /* Get request time */ NULL, /* Child terminate */ STANDARD_SAPI_MODULE_PROPERTIES };

        由上面代碼可見,PHP的SAPI像是面向?qū)ο笾谢悾琒API.h和SAPI.c包含的函數(shù)是抽象基類的聲明和定義,各個服務(wù)器用的SAPI模式,則是繼承了這個基類,并重新定義基類方法的子類。

        總結(jié)

        PHP的SAPI是Zend引擎提供的一組標準交互接口,通過注冊初始化、析構(gòu)、輸入、輸出等接口,我們可以將應(yīng)用程序運行在Zend引擎上,也可以把PHP嵌入到類似Apache的Web Server中。PHP常見的SAPI模式有五種,CGI/CLI模式、多進程模式、多線程模式、FastCGI模式和內(nèi)嵌模式。

        了解PHP的SAPI機制意義重大,幫助我們理解PHP的生命周期,并了解如何更好的通過C/C++為PHP編寫擴展,并在生命周期中找到提高系統(tǒng)性能的方式。

      【php內(nèi)核知識解讀】相關(guān)文章:

      如何學好PHP知識09-20

      PHP語言新手入門知識09-27

      PHP高手需要掌握的知識點02-15

      攝影入門知識解讀201509-02

      Smarty (PHP模板引擎)知識點介紹06-12

      烹飪基礎(chǔ)知識解讀201507-16

      美發(fā)知識解讀2015:特殊色的染法10-22

      關(guān)于php面試寶典及PHP面試技巧08-16

      PHP的壓縮函數(shù)06-21

      php高級教程01-23

      主站蜘蛛池模板: 国产日韩亚洲一区二区| 国产日韩AV无码免费一区二区| 精品久久久久久国产潘金莲| 日本一区二区三深夜不卡| 久久精品国产亚洲AV古装片| 久草精品手机视频在线观看 | 日韩在线不卡一区在线观看| 午夜爽毛片| 炉霍县| 熟妇人妻不卡中文字幕| 久久露脸国产精品WWW| 久久久精品国产亚洲麻色欲| 基隆市| 超碰av男人一区二区| 人妻无码中文专区久久AV| 欧洲一级无码AV毛片免费| 河西区| 电白县| 久久久亚洲日本精品一区| 九九日本黄色精品视频| 成年女人在线观看毛片| 三级全黄的视频在线观看| 亚洲av人片在线观看调教| 国产精品美女黑丝流水| 亚洲国产精品性色av| 长治市| 磴口县| 亚洲AV无码一区二区一二区教师 | 区无码字幕中文色| 日本一极品久久99精品| 中文字幕少妇人妻视频| 海林市| 国产亚洲人成在线影院| 亚洲AV无码一区二区一二区教师| www.91久久| 国产午夜精品久久久久九九| 欧美精品高清在线xxxx| 亚洲女同精品久久女同| av国产熟妇露脸在线观看| 人妻少妇精品一区二区三区| 国产精品毛片99久久久久|