电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

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

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
相關文章:
主站蜘蛛池模板: RTO换向阀_VOC高温阀门_加热炉切断阀_双偏心软密封蝶阀_煤气蝶阀_提升阀-湖北霍科德阀门有限公司 | 注塑模具_塑料模具_塑胶模具_范仕达【官网】_东莞模具设计与制造加工厂家 | 车牌识别道闸_停车场收费系统_人脸识别考勤机_速通门闸机_充电桩厂家_中全清茂官网 | 盘装氧量分析仪-防爆壁挂氧化锆分析仪-安徽吉帆仪表有限公司 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 裹包机|裹膜机|缠膜机|绕膜机-上海晏陵智能设备有限公司 | LED太阳能中国结|发光红灯笼|灯杆造型灯|节日灯|太阳能灯笼|LED路灯杆装饰造型灯-北京中海轩光电 | 欧美日韩国产一区二区三区不_久久久久国产精品无码不卡_亚洲欧洲美洲无码精品AV_精品一区美女视频_日韩黄色性爱一级视频_日本五十路人妻斩_国产99视频免费精品是看4_亚洲中文字幕无码一二三四区_国产小萍萍挤奶喷奶水_亚洲另类精品无码在线一区 | 风淋室生产厂家报价_传递窗|送风口|臭氧机|FFU-山东盛之源净化设备 | 杭州月嫂技术培训服务公司-催乳师培训中心报名费用-产后康复师培训机构-杭州优贝姆健康管理有限公司 | 江门流水线|江门工作台|江门市伟涛行工业设备有限公司 | 北京中创汇安科贸有限公司 | 沧州友城管业有限公司-内外涂塑钢管-大口径螺旋钢管-涂塑螺旋管-保温钢管生产厂家 | 亮化工程,亮化设计,城市亮化工程,亮化资质合作,长沙亮化照明,杰奥思【官网】 | 英国公司注册-新加坡公司注册-香港公司开户-离岸公司账户-杭州商标注册-杭州优创企业 | 【德信自动化】点胶机_全自动点胶机_自动点胶机厂家_塑料热压机_自动螺丝机-深圳市德信自动化设备有限公司 | 单电机制砂机,BHS制砂机,制沙机设备,制砂机价格-正升制砂机厂家 单级/双级旋片式真空泵厂家,2xz旋片真空泵-浙江台州求精真空泵有限公司 | 电机保护器-电动机综合保护器-上海硕吉电器有限公司 | 气动隔膜阀_气动隔膜阀厂家_卫生级隔膜阀价格_浙江浙控阀门有限公司 | 大行程影像测量仪-探针型影像测量仪-增强型影像测量仪|首丰百科 大通天成企业资质代办_承装修试电力设施许可证_增值电信业务经营许可证_无人机运营合格证_广播电视节目制作许可证 | 预制围墙_工程预制围墙_天津市瑞通建筑材料有限公司 | 防水套管|柔性防水套管|伸缩器|伸缩接头|传力接头-河南伟创管道 防水套管_柔性防水套管_刚性防水套管-巩义市润达管道设备制造有限公司 | 隧道风机_DWEX边墙风机_SDS射流风机-绍兴市上虞科瑞风机有限公司 | 挤出机_橡胶挤出机_塑料挤出机_胶片冷却机-河北伟源橡塑设备有限公司 | 对辊破碎机_四辊破碎机_双齿辊破碎机_华盛铭重工 | 房车价格_依维柯/大通/东风御风/福特全顺/江铃图片_云梯搬家车厂家-程力专用汽车股份有限公司 | 自动记录数据电子台秤,记忆储存重量电子桌称,设定时间记录电子秤-昆山巨天 | MOOG伺服阀维修,ATOS比例流量阀维修,伺服阀维修-上海纽顿液压设备有限公司 | 塑钢课桌椅、学生课桌椅、课桌椅厂家-学仕教育设备首页 | 哲力实业_专注汽车涂料汽车漆研发生产_汽车漆|修补油漆品牌厂家 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 低粘度纤维素|混凝土灌浆料|有机硅憎水粉|聚羧酸减水剂-南京斯泰宝 | 丹佛斯变频器-Danfoss战略代理经销商-上海津信变频器有限公司 | 上海恒驭仪器有限公司-实验室平板硫化机-小型平板硫化机-全自动平板硫化机 | 乐泰胶水_loctite_乐泰胶_汉高乐泰授权(中国)总代理-鑫华良供应链 | 干法制粒机_智能干法制粒机_张家港市开创机械制造有限公司 | 科威信洗净科技,碳氢清洗机,超声波清洗机,真空碳氢清洗机 | 淘趣英语网 - 在线英语学习,零基础英语学习网站 | 防爆大气采样器-防爆粉尘采样器-金属粉尘及其化合物采样器-首页|盐城银河科技有限公司 | 车件|铜件|车削件|车床加工|五金冲压件-PIN针,精密车件定制专业厂商【东莞品晔】 | PC构件-PC预制构件-构件设计-建筑预制构件-PC构件厂-锦萧新材料科技(浙江)股份有限公司 | 东莞动力锂电池保护板_BMS智能软件保护板_锂电池主动均衡保护板-东莞市倡芯电子科技有限公司 |