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

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

PHP內核探索 —— 通過mod_php5支持PHP

瀏覽:4日期:2022-09-16 11:47:06

Apache對PHP的支持是通過Apache的模塊mod_php5來支持的。如果希望Apache支持PHP的話,在./configure步驟需要指定--with-apxs2=/usr/local/apache2/bin/apxs?表示告訴編譯器通過Apache的mod_php5/apxs來提供對PHP5的解析。

在最后一步make install的時候我們會看到將動態鏈接庫libphp5.so(Apache模塊)拷貝到apache2的安裝目錄的modules目錄下,并且還需要在httpd.conf配置文件中添加LoadModule語句來動態將libphp5.so?模塊加載進來,從而實現Apache對php的支持。

由于該模式實在太經典了,因此這里關于安裝部分不準備詳述了,相對來說比較簡單。我們知道nginx一般包括兩個用途HTTP Server和Reverse Proxy Server(反向代理服務器)。在前端可以部署nginx作為reverse proxy server,后端布置多個Apache來實現集群系統server cluster架構的。

因此,實際生產中,我們仍舊能夠保留Apache+mod_php5的經典App Server,而僅僅使用nginx來當做前端的reverse proxy server來實現代理和負載均衡。?因此,建議nginx(1個或者多個)+多個apache的架構繼續使用下去。

Apache2的mod_php5模塊包括sapi/apache2handler和sapi/apache2filter兩個目錄 在apache2_handle/mod_php5.c文件中,模塊定義的相關代碼如下:

AP_MODULE_DECLARE_DATA module php5_module = { STANDARD20_MODULE_STUFF,/* 宏,包括版本,小版本,模塊索引,模塊名,下一個模塊指針等信息,其中模塊名以__FILE__體現 */ create_php_config, /* create per-directory config structure */ merge_php_config, /* merge per-directory config structures */ NULL, /* create per-server config structure */ NULL, /* merge per-server config structures */ php_dir_cmds, /* 模塊定義的所有的指令 */ php_ap2_register_hook/* 注冊鉤子,此函數通過ap_hoo_開頭的函數在一次請求處理過程中對于指定的步驟注冊鉤子 */};

它所對應的是Apache的module結構,module的結構定義如下:

typedef struct module_struct module;struct module_struct { int version; int minor_version; int module_index; const char *name; void *dynamic_load_handle; struct module_struct *next; unsigned long magic; void (*rewrite_args) (process_rec *process); void *(*create_dir_config) (apr_pool_t *p, char *dir); void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf); void *(*create_server_config) (apr_pool_t *p, server_rec *s); void *(*merge_server_config) (apr_pool_t *p, void *base_conf, void *new_conf); const command_rec *cmds; void (*register_hooks) (apr_pool_t *p);}

上面的模塊結構與我們在mod_php5.c中所看到的結構有一點不同,這是由于STANDARD20_MODULE_STUFF的原因, 這個宏它包含了前面8個字段的定義。STANDARD20_MODULE_STUFF宏的定義如下:

/** Use this in all standard modules */#define STANDARD20_MODULE_STUFF MODULE_MAGIC_NUMBER_MAJOR, MODULE_MAGIC_NUMBER_MINOR, -1, __FILE__, NULL, NULL, MODULE_MAGIC_COOKIE, NULL /* rewrite args spot */

在php5_module定義的結構中,php_dir_cmds是模塊定義的所有的指令集合,其定義的內容如下:

const command_rec php_dir_cmds[] ={ AP_INIT_TAKE2('php_value', php_apache_value_handler, NULL,OR_OPTIONS, 'PHP Value Modifier'), AP_INIT_TAKE2('php_flag', php_apache_flag_handler, NULL,OR_OPTIONS, 'PHP Flag Modifier'), AP_INIT_TAKE2('php_admin_value', php_apache_admin_value_handler,NULL, ACCESS_CONF|RSRC_CONF, 'PHP Value Modifier (Admin)'), AP_INIT_TAKE2('php_admin_flag', php_apache_admin_flag_handler,NULL, ACCESS_CONF|RSRC_CONF, 'PHP Flag Modifier (Admin)'), AP_INIT_TAKE1('PHPINIDir', php_apache_phpini_set, NULL,RSRC_CONF, 'Directory containing the php.ini file'), {NULL}};

這是mod_php5模塊定義的指令表。它實際上是一個command_rec結構的數組。 當Apache遇到指令的時候將逐一遍歷各個模塊中的指令表,查找是否有哪個模塊能夠處理該指令, 如果找到,則調用相應的處理函數,如果所有指令表中的模塊都不能處理該指令,那么將報錯。 如上可見,mod_php5模塊僅提供php_value等5個指令。

php_ap2_register_hook函數的定義如下:

void php_ap2_register_hook(apr_pool_t *p){ ap_hook_pre_config(php_pre_config, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_post_config(php_apache_server_startup, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_handler(php_handler, NULL, NULL, APR_HOOK_MIDDLE); ap_hook_child_init(php_apache_child_init, NULL, NULL, APR_HOOK_MIDDLE);}

以上代碼聲明了pre_config,post_config,handler和child_init 4個掛鉤以及對應的處理函數。 其中pre_config,post_config,child_init是啟動掛鉤,它們在服務器啟動時調用。 handler掛鉤是請求掛鉤,它在服務器處理請求時調用。其中在post_config掛鉤中啟動php。 它通過php_apache_server_startup函數實現。php_apache_server_startup函數通過調用sapi_startup啟動sapi, 并通過調用php_apache2_startup來注冊sapi module struct(此結構在本節開頭中有說明), 最后調用php_module_startup來初始化PHP, 其中又會初始化ZEND引擎,以及填充zend_module_struct中 的treat_data成員(通過php_startup_sapi_content_types)等。

到這里,我們知道了Apache加載mod_php5模塊的整個過程,可是這個過程與我們的SAPI有什么關系呢? mod_php5也定義了屬于Apache的sapi_module_struct結構:

static sapi_module_struct apache2_sapi_module = {'apache2handler','Apache 2.0 Handler',php_apache2_startup,/* startup */php_module_shutdown_wrapper, /* shutdown */NULL, /* activate */NULL, /* deactivate */php_apache_sapi_ub_write, /* unbuffered write */php_apache_sapi_flush, /* flush */php_apache_sapi_get_stat, /* get uid */php_apache_sapi_getenv, /* getenv */php_error, /* error handler */php_apache_sapi_header_handler, /* header handler */php_apache_sapi_send_headers, /* send headers handler */NULL, /* send header handler */php_apache_sapi_read_post, /* read POST data */php_apache_sapi_read_cookies, /* read Cookies */php_apache_sapi_register_variables,php_apache_sapi_log_message, /* Log message */php_apache_sapi_get_request_time, /* Request Time */NULL, /* Child Terminate */STANDARD_SAPI_MODULE_PROPERTIES};

這些方法都專屬于Apache服務器。以讀取cookie為例,當我們在Apache服務器環境下,在PHP中調用讀取Cookie時, 最終獲取的數據的位置是在激活SAPI時。它所調用的方法是read_cookies。

SG(request_info).cookie_data = sapi_module.read_cookies(TSRMLS_C);

對于每一個服務器在加載時,我們都指定了sapi_module,而Apache的sapi_module是apache2_sapi_module。 其中對應read_cookies方法的是php_apache_sapi_read_cookies函數。 這也是定義SAPI結構的理由:統一接口,面向接口的編程,具有更好的擴展性和適應性。

標簽: PHP
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
国产伦精品一区二区三区视频孕妇| 欧美一区二区三区婷婷月色| 欧美影院一区二区| 亚洲女女做受ⅹxx高潮| 97aⅴ精品视频一二三区| 欧美日韩在线播放| 奇米影视一区二区三区小说| 国产精品一区二区a| 亚洲色欲色欲www| 亚洲精品自在在线观看| 亚洲欧洲成人自拍| 伊大人香蕉综合8在线视| 日本一区二区三区久久久久久久久不 | 寂寞少妇一区二区三区| 亚洲一区二区免费看| 亚洲免费av高清| 亚洲三级影院| 亚洲人成在线播放网站岛国 | 欧美三级中文字幕在线观看| 免费高清视频精品| 在线免费av一区| 日韩高清在线不卡| 久久精品道一区二区三区| 亚洲成在线观看| 国产美女诱惑一区二区| 一区二区三区资源| 亚洲欧美久久久久一区二区三区| 亚洲一区二区三区中文字幕| 亚洲美洲欧洲综合国产一区| 成人欧美一区二区三区小说| 亚洲大胆av| 一区二区三区四区高清精品免费观看 | 国产一区999| 日韩一区二区视频| 成人av免费观看| 国产精品素人视频| 亚洲国产精品久久久久婷婷老年| 一区在线中文字幕| 精品福利电影| 亚洲人成网站色在线观看| 亚洲三级免费| 婷婷久久综合九色国产成人 | 91麻豆精品国产91久久久资源速度 | 精品无人码麻豆乱码1区2区 | 亚洲综合色视频| 蜜桃视频一区| 毛片av一区二区| 日韩一区二区电影网| 91丨九色丨尤物| 亚洲欧美日韩电影| 可以免费看不卡的av网站| 久久av中文字幕片| 日韩你懂的电影在线观看| 色综合欧美在线| 成人欧美一区二区三区在线播放| 一级成人国产| 日本不卡的三区四区五区| 欧美日韩亚州综合| 成人午夜电影小说| 欧美激情中文字幕| 亚洲人成人一区二区三区| 亚洲一二三四久久| 欧美日韩一区二区在线观看视频| 成人免费高清视频在线观看| 中文字幕亚洲精品在线观看 | 欧美激情综合| 一区二区三区在线免费播放| 日本大香伊一区二区三区| 国产剧情av麻豆香蕉精品| 久久久久久久久99精品| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲午夜精品在线| 欧美日韩亚洲另类| 成人午夜私人影院| 亚洲免费电影在线| 欧美日韩情趣电影| 欧美日本一区| 日韩电影在线一区二区三区| 日韩一区二区三区电影| 欧美日韩国产精品一区二区亚洲| 亚洲一区二区三区影院| 91.xcao| 国产综合精品| 日韩不卡免费视频| 26uuu亚洲| 亚洲综合激情| 国产不卡高清在线观看视频| 国产精品国产三级国产aⅴ原创| 国产嫩草一区二区三区在线观看| 国产乱一区二区| 中文字幕亚洲一区二区av在线| 欧美影视一区在线| 午夜久久黄色| 久久爱另类一区二区小说| 国产欧美一区二区三区网站| 久久精品综合| 91在线视频18| 蜜臀av亚洲一区中文字幕| 久久久99免费| 亚洲一区二区三区涩| 国产成a人亚洲| 亚洲一区日韩精品中文字幕| 日韩手机在线导航| 国产亚洲网站| 国产麻豆日韩欧美久久| 欧美一区二区三区四区在线观看地址| 欧美日韩精品免费观看 | 在线观看日韩一区| 精品综合免费视频观看| 亚洲欧美影音先锋| 91麻豆精品国产91久久久使用方法 | 欧美三电影在线| 久久精品二区三区| 西西人体一区二区| 久久理论电影网| 亚洲欧美视频一区| 国产一区二区精品久久99| 日韩一区二区久久| 国产色产综合色产在线视频| 一本一道久久a久久精品综合蜜臀 一本一道综合狠狠老 | 久久美女高清视频| 欧美视频三区在线播放| 亚洲高清在线播放| 99久久久无码国产精品| 麻豆91在线观看| 亚洲精品欧美综合四区| 精品久久久网站| 在线观看亚洲精品视频| 亚洲精品日本| av资源站一区| 国模一区二区三区白浆| 午夜精品福利久久久| 日韩一区在线播放| 国产亚洲综合av| 欧美一卡二卡三卡| 在线视频一区二区免费| 韩日精品在线| 99国产精品久久久久久久久久| 日本不卡在线视频| 一区二区三区四区亚洲| 中文字幕av不卡| 精品少妇一区二区| 欧美福利视频一区| 久久综合久久综合这里只有精品| 亚洲国产婷婷| 欧美日韩一区二区高清| 成人app在线| 国产福利一区二区三区| 蜜桃一区二区三区在线观看| 一区二区三区欧美视频| 国产精品毛片无遮挡高清| 欧美大片日本大片免费观看| 欧美日韩一区在线| 色噜噜狠狠色综合欧洲selulu| 一级成人国产| 尹人成人综合网| 你懂的亚洲视频| 99久久99久久精品免费看蜜桃| 国产精品一二三区在线| 九九热在线视频观看这里只有精品| 亚洲r级在线视频| 亚洲影院免费观看| 亚洲精品乱码久久久久久| 中文字幕亚洲成人| 自拍视频在线观看一区二区| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 91在线免费视频观看| 成人在线一区二区三区| 国产高清成人在线| 国产成人一区二区精品非洲| 国产激情视频一区二区三区欧美 | 欧美中文字幕一区| 欧美中文字幕一区二区三区| 色素色在线综合| 老妇喷水一区二区三区| 久久久久久穴| 色88888久久久久久影院按摩 | 亚洲欧美另类久久久精品| 中文字幕中文乱码欧美一区二区| 国产亚洲欧美日韩俺去了| 久久毛片高清国产| 国产日产精品一区| 久久久精品免费网站| 久久久久久久久久久久久女国产乱| 欧美大度的电影原声| 欧美成va人片在线观看| 2021国产精品久久精品| 久久久久久久综合狠狠综合| 国产欧美在线观看一区| 国产精品美日韩| 亚洲欧美日韩国产一区二区三区| 一区二区三区中文在线| 天天影视涩香欲综合网| 日韩va亚洲va欧美va久久| 久久不见久久见免费视频1| 国产精品99久久久久| 国产91丝袜在线18| 99久久综合精品| 黄色亚洲精品| 亚洲欧美日韩精品一区二区|