成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

PHP內核探索 —— 再次探討SAPI

瀏覽:4日期:2022-09-16 11:22:57

在PHP的生命周期的各個階段,一些與服務相關的操作都是通過SAPI接口實現。 這些內置實現的物理位置在PHP源碼的SAPI目錄。這個目錄存放了PHP對各個服務器抽象層的代碼, 例如命令行程序的實現,Apache的mod_php5模塊實現以及fastcgi的實現等等。

在各個服務器抽象層之間遵守著相同的約定,這里我們稱之為SAPI接口。 每個SAPI實現都是一個_sapi_module_struct結構體變量。(SAPI接口)。 在PHP的源碼中,當需要調用服務器相關信息時,全部通過SAPI接口中對應方法調用實現, 而這對應的方法在各個服務器抽象層實現時都會有各自的實現。

下面是為SAPI的簡單示意圖:

PHP內核探索 —— 再次探討SAPI

以cgi模式和apache2服務器為例,它們的啟動方法如下:

cgi_sapi_module.startup(&cgi_sapi_module) // cgi模式 cgi/cgi_main.c文件apache2_sapi_module.startup(&apache2_sapi_module); // apache2服務器 apache2handler/sapi_apache2.c文件

這里的cgi_sapi_module是sapi_module_struct結構體的靜態變量。 它的startup方法指向php_cgi_startup函數指針。在這個結構體中除了startup函數指針,還有許多其它方法或字段。 其部分定義如下

struct _sapi_module_struct { char *name; // 名字(標識用) char *pretty_name; // 更好理解的名字(自己翻譯的) int (*startup)(struct _sapi_module_struct *sapi_module); // 啟動函數 int (*shutdown)(struct _sapi_module_struct *sapi_module); // 關閉方法 int (*activate)(TSRMLS_D); // 激活 int (*deactivate)(TSRMLS_D); // 停用 int (*ub_write)(const char *str, unsigned int str_length TSRMLS_DC); // 不緩存的寫操作(unbuffered write) void (*flush)(void *server_context); // flush struct stat *(*get_stat)(TSRMLS_D); // get uid char *(*getenv)(char *name, size_t name_len TSRMLS_DC); // getenv void (*sapi_error)(int type, const char *error_msg, ...); /* error handler */ int (*header_handler)(sapi_header_struct *sapi_header, sapi_header_op_enum op,sapi_headers_struct *sapi_headers TSRMLS_DC); /* header handler */ /* send headers handler */ int (*send_headers)(sapi_headers_struct *sapi_headers TSRMLS_DC); void (*send_header)(sapi_header_struct *sapi_header, void *server_context TSRMLS_DC); /* send header handler */ int (*read_post)(char *buffer, uint count_bytes TSRMLS_DC); /* read POST data */ char *(*read_cookies)(TSRMLS_D); /* read Cookies */ /* register server variables */ void (*register_server_variables)(zval *track_vars_array TSRMLS_DC); void (*log_message)(char *message); /* Log message */ time_t (*get_request_time)(TSRMLS_D); /* Request Time */ void (*terminate_process)(TSRMLS_D); /* Child Terminate */ char *php_ini_path_override; // 覆蓋的ini路徑 ... ...};

以上的這些結構在各服務器的接口實現中都有定義。如Apache2的定義:

static sapi_module_struct apache2_sapi_module = { 'apache2handler', 'Apache 2.0 Handler', php_apache2_startup,/* startup */ php_module_shutdown_wrapper, /* shutdown */ ...}

目前PHP內置的很多SAPI實現都已不再維護或者變的有些非主流了,PHP社區目前正在考慮將一些SAPI移出代碼庫。 社區對很多功能的考慮是除非真的非常必要,或者某些功能已近非常通用了,否則就在PECL庫中, 例如非常流行的APC緩存擴展將進入核心代碼庫中。

整個SAPI類似于一個面向對象中的模板方法模式的應用。 SAPI.c和SAPI.h文件所包含的一些函數就是模板方法模式中的抽象模板, 各個服務器對于sapi_module的定義及相關實現則是一個個具體的模板。

這樣的結構在PHP的源碼中有多處使用, 比如在PHP擴展開發中,每個擴展都需要定義一個zend_module_entry結構體。 這個結構體的作用與sapi_module_struct結構體類似,都是一個類似模板方法模式的應用。 在PHP的生命周期中如果需要調用某個擴展,其調用的方法都是zend_module_entry結構體中指定的方法, 如在上一小節中提到的在執行各個擴展的請求初始化時,都是統一調用request_startup_func方法, 而在每個擴展的定義時,都通過宏PHP_RINIT指定request_startup_func對應的函數。 以VLD擴展為例:其請求初始化為PHP_RINIT(vld),與之對應在擴展中需要有這個函數的實現:

PHP_RINIT_FUNCTION(vld) {}

所以, 我們在寫擴展時也需要實現擴展的這些接口,同樣,當實現各服務器接口時也需要實現其對應的SAPI。

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
欧美人狂配大交3d怪物一区| 国产日韩亚洲| 欧美一区二区视频在线| 久久综合伊人| 亚洲免费观看高清完整版在线| 美腿丝袜亚洲色图| 国产日韩欧美一区二区三区四区| 国产女主播一区| 九色综合国产一区二区三区| 一本到不卡免费一区二区| 亚洲一区二区欧美| 一区二区冒白浆视频| 国产精品久久久久aaaa| 国产精品va| 中文字幕欧美日韩一区| 欧美成人蜜桃| 国产色爱av资源综合区| 99国产精品久久久久久久久久久| 日韩精品一区二| 国产白丝精品91爽爽久久| 欧美精品黑人性xxxx| 精品亚洲国产成人av制服丝袜 | 欧美日韩国产乱码电影| 免费在线观看精品| 色av一区二区| 久久99国产精品久久99| 欧美日韩另类一区| 精品一区二区三区在线观看国产| 欧美图区在线视频| 久久99日本精品| 欧美日韩在线综合| 麻豆国产欧美日韩综合精品二区| 久久在线视频| 日本网站在线观看一区二区三区| 老司机午夜精品视频在线观看| 亚洲一区在线免费观看| 欧美亚洲视频| 丝袜亚洲另类欧美| 91福利视频在线| 奇米影视一区二区三区| 色中色一区二区| 久久国产生活片100| 51精品视频一区二区三区| 成人在线视频首页| 欧美极品美女视频| 一区二区国产日产| 丝袜国产日韩另类美女| 亚洲一区免费看| 日韩在线一二三区| 欧美日韩免费观看一区三区| 国内精品视频一区二区三区八戒| 欧美一区二区三区人| 成人国产免费视频| 欧美高清一级片在线观看| 一区二区欧美日韩| 日韩精品免费视频人成| 欧美性猛交xxxx乱大交退制版| 久久电影国产免费久久电影| 欧美群妇大交群中文字幕| 高清不卡一区二区| 久久蜜桃一区二区| 欧美日韩综合网| 樱花影视一区二区| 蜜桃久久精品乱码一区二区| 六月丁香婷婷色狠狠久久| 欧美一级视频精品观看| jiyouzz国产精品久久| 国产精品国产三级国产普通话99| 亚洲欧美久久久| 国产一区在线观看麻豆| 久久欧美一区二区| 国产一区二区高清| 国产麻豆9l精品三级站| 国产拍揄自揄精品视频麻豆| 国产毛片一区| 国产一本一道久久香蕉| 精品国产污网站| 亚洲精品在线视频观看| 另类小说综合欧美亚洲| 久久久噜噜噜久久人人看| 伊人成人在线视频| 日韩激情视频在线观看| 欧美sm美女调教| 99爱精品视频| 黑人巨大精品欧美一区| 国产婷婷色一区二区三区在线| 国产偷国产偷亚洲高清97cao| 老司机午夜精品99久久| 国产农村妇女精品| 久久综合九九| 91在线你懂得| 日韩激情视频网站| 国产午夜精品一区二区| 久久精品日韩欧美| av一区二区久久| 亚洲影院久久精品| 日韩亚洲国产中文字幕欧美| 9国产精品视频| 国产xxx精品视频大全| 亚洲精品乱码久久久久久黑人| 欧美福利视频导航| 亚洲午夜极品| 久久成人麻豆午夜电影| 欧美国产精品v| 欧美日韩三级在线| 伊人久久av导航| 国产一区二区91| 亚洲影视在线播放| 日韩免费在线观看| 国产嫩草一区二区三区在线观看 | 免费欧美在线视频| 国产日韩精品久久久| 欧美色综合网站| 亚洲国产精品一区制服丝袜 | 在线观看欧美一区| 国产麻豆日韩欧美久久| 亚洲精品v日韩精品| 日韩欧美亚洲国产精品字幕久久久| 国模吧视频一区| 国产一区二区三区免费| 夜夜精品浪潮av一区二区三区| 日韩美女在线视频| 国产农村妇女精品一区二区| 欧美黄色一区| 国产精品一区二区三区乱码| 一区二区三区不卡视频在线观看| 日韩欧美国产精品| 美女黄色成人网| 国产精品mm| 成人小视频在线| 免费av成人在线| 亚洲精品亚洲人成人网在线播放| 精品国产精品网麻豆系列| 日韩一区在线免费观看| 一区二区国产视频| 色综合久久中文字幕综合网| 欧美日韩1区2区3区| 鲁大师影院一区二区三区| 色噜噜狠狠成人中文综合 | 一区视频在线看| 精品国产一区二区三区不卡 | 亚洲影院免费观看| 欧美第一区第二区| 色婷婷综合视频在线观看| 亚洲黄色高清| 97精品电影院| 国产精一区二区三区| 亚洲欧美日韩国产综合| 久久免费的精品国产v∧| 日韩一区二区免费高清| 色伊人久久综合中文字幕| 一本色道久久综合亚洲精品不卡 | 亚洲一区在线观看网站| 亚洲国产成人一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av| 欧美高清精品3d| 欧美三级电影网站| 久久精品一本| 国产精品一区亚洲| 亚洲第一精品影视| 欧美在线免费| av欧美精品.com| 成人深夜在线观看| 一区二区成人在线视频| 国产亚洲精久久久久久| 日韩欧美三级在线| 欧美日韩一级片在线观看| 久久在线精品| 色婷婷av一区二区三区软件| 国产午夜精品在线| 尤物在线精品| 激情婷婷久久| 精品动漫3d一区二区三区免费| 99精品久久久久久| 成人av电影免费观看| 国产高清久久久久| 国产一区二区伦理| 国产一区二区精品久久| 狠狠狠色丁香婷婷综合久久五月| 精东粉嫩av免费一区二区三区| 蜜臂av日日欢夜夜爽一区| 日韩成人午夜电影| 蜜臀av一区二区| 青草av.久久免费一区| 日韩精品国产精品| 日本中文字幕一区二区有限公司| 肉色丝袜一区二区| 性做久久久久久免费观看| 亚洲成国产人片在线观看| 欧美高清性hdvideosex| 欧美精品1区2区| 日韩一级片网址| 日韩精品一区二区三区中文精品| 日韩欧美资源站| 欧美va亚洲va香蕉在线| 欧美mv日韩mv| 久久久精品综合| 中文字幕精品在线不卡| 国产精品福利一区| 亚洲激情综合网|