http://www.samnolan.com

                                                                  【罗马好运彩计划】深入理解PHP原理之PHP与WEB服务器交互-PHP问题

                                                                  大家都知道,PHP需要在具体的WEB服务器中才能运行,例如Nginx、Apache等,但是PHP是怎样启动,又是怎样在服务器中运行,然后两者又是怎样进行交互的呢?

                                                                  1.WEB服务器调用PHP接口

                                                                    以Apache服务器为例,我们看看该服务器是怎样启动PHP,并调用PHP中的方法。Apache服务器启动并运行PHP时,一般是通过mod_php7模块的形式集成(如果是php5.*版本,就是mod_php5模块,模块后缀名根据php版本而定),mod_php7的结构如下(源码路径为php/sapi/apache2handler/mod_php7.c):

                                                                  AP_MODULE_DECLARE_DATA module php7_module = {    STANDARD20_MODULE_STUFF,/* 宏,包括版本,版本,模块索引,模块名,下个模块指针等信息 */    create_php_config,      /* create per-direct)ory 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   /* register hooks */};

                                                                  当Apache需要调用PHP中的方法时,只需要将该请求通过mod_php7模块传达给PHP,PHP层处理完后将数据返回给Apache,整个过程就结束了(补充一下:Apache服务器启动PHP时,其实有两种加载方式,一种为静态加载,一种为动态加载,刚才讨论的mod_php5模块加载方式可以理解为静态加载,也就是需要重新启动Apache服务器,才能将PHP加载进去;动态加载不需要重启服务器,只需要通过发送信号的方式将PHP固定的模块加载到服务器,以达到PHP启动的目的,但是在进行动态加载前,需要将加载模块编译成动态链接库,然后将其配置到服务器的配置文件中)。上面已经给出Apache在PHP中的model结构,下面给出Apache服务器中对应的module结构,如下(该源代码在Apache中,下同):

                                                                  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);}

                                                                  可以看得出php7_module和module_struct还是有很大不同,不过如果看到php7_module.STANDARD20_MODULE_STUFF这个宏的定义方式,你可能就会觉得这两个结构体很像,其实这个宏定义了module_struct中的前8个参数,定义如下:

                                                                  #define STANDARD20_MODULE_STUFF MODULE_MAGIC_NUMBER_MAJOR, \    MODULE_MAGIC_NUMBER_MINOR, \    -1, \    __FILE__, \    NULL, \    NULL, \    MODULE_MAGIC_COOKIE, \    NULL /* rewrite args spot */
                                                                                  

                                                                  郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

                                                                  上一篇:Parrot 退出迷你无人机市场,集中商用产品业务
                                                                  下一篇:没有了