激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频

php內核知識解讀

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

php內核知識解讀

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

php內核知識解讀

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

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

  圖1. PHP架構圖

  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(多進(jìn)程)、Multithreaded(多線(xiàn)程)、FastCGI和Embedded(內嵌)。

  PHP提供了一個(gè)函數查看當前SAPI接口類(lèi)型:

  復制代碼 代碼如下:

  string php_sapi_name ( void )

  PHP的運行和加載

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

  什么是PHP模塊?通過(guò)上面的PHP架構圖,在PHP中可以使用get_loaded_extensions 函數來(lái)查看所有編譯并加載的模塊/擴展,相當于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; /* 執行了一些類(lèi)似的初始化操作 */ return SUCCESS; }

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

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

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

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

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

  常見(jiàn)的運行模式

  常見(jiàn)的SAPI模式有五種:

  CLI和CGI模式(單進(jìn)程模式)

  多進(jìn)程模式

  多線(xiàn)程模式

  FastCGI模式

  嵌入式

  1. CLI/CGI模式

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

  圖2. CGI/CLI生命周期

  2. 多進(jìn)程模式(Multiprocess)

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

  圖3. 多進(jìn)程模式生命周期

  在一個(gè)子進(jìn)程中,PHP的生命周期是調用MINT啟動(dòng)后,執行多次請求(RINT/RSHUTDOWN),在A(yíng)pache關(guān)閉或進(jìn)程結束后,才會(huì )調用MSHUTDOWN進(jìn)行回收階段。

  圖4. 多進(jìn)程的生命周期

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

  3. 多線(xiàn)程模式(Multithreaded)

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

  圖5. 多線(xiàn)程生命周期

  4. FastCGI模式

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

  圖6. FastCGI模式生命周期

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

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

  5. 內嵌模式(Embedded)

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

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

  詳細請見(jiàn): /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初始化時(shí),首先會(huì )調用該函數 */ php_module_shutdown_wrapper, /* shutdown 關(guān)閉函數包裝器,它用來(lái)釋放所有的SAPI的數據結構、內存等,調用php_module_shutdown */ sapi_cgi_activate, /* activate 此函數會(huì )在每個(gè)請求開(kāi)始時(shí)調用,它會(huì )做初始化,資源分配 */ sapi_cgi_deactivate, /* deactivate 此函數會(huì )在每個(gè)請求結束時(shí)調用,它用來(lái)確保所有的數據都得到釋放 */ sapi_cgi_ub_write, /* unbuffered write 不緩存的寫(xiě)操作(unbuffered write),它是用來(lái)向SAPI外部輸出數據 */ sapi_cgi_flush, /* flush 刷新輸出,在CLI模式下通過(guò)使用C語(yǔ)言的庫函數fflush實(shí)現*/ NULL, /* get uid */ sapi_cgi_getenv, /* getenv 根據name查找環(huán)境變量 */ php_error, /* error handler 注冊錯誤處理函數 */ NULL, /* header handler PHP調用header()時(shí)候被調用 */ sapi_cgi_send_headers, /* send headers handler 發(fā)送頭部信息*/ NULL, /* send header handler 發(fā)送一個(gè)單獨的頭部信息 */ sapi_cgi_read_post, /* read POST data 當請求的方法是POST時(shí),程序獲取POST數據,寫(xiě)入$_POST數組 */ 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 };

  由上面代碼可見(jiàn),PHP的SAPI像是面向對象中基類(lèi),SAPI.h和SAPI.c包含的函數是抽象基類(lèi)的聲明和定義,各個(gè)服務(wù)器用的SAPI模式,則是繼承了這個(gè)基類(lèi),并重新定義基類(lèi)方法的子類(lèi)。

  總結

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

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

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

如何學(xué)好PHP知識09-20

PHP語(yǔ)言新手入門(mén)知識09-27

PHP高手需要掌握的知識點(diǎn)02-15

攝影入門(mén)知識解讀201509-02

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

烹飪基礎知識解讀201507-16

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

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

PHP的壓縮函數06-21

php高級教程01-23

激情欧美日韩一区二区,浪货撅高贱屁股求主人调教视频,精品无码成人片一区二区98,国产高清av在线播放,色翁荡息又大又硬又粗视频