• [PHP] PHP与Apache的模块配合说明


    1.当PHP需要在Apache服务器下运行时

    一般来说,它可以mod_php5模块的形式集成, 此时mod_php5模块的作用是接收Apache传递过来的PHP文件请求,并处理这些请求, 然后将处理后的结果返回给Apache。
    加载方式有两种:Apache启动时的加载,或者运行的时候动态装载

    2.Apache的运行过程
    Apache的运行分为启动阶段和运行阶段。 在启动阶段,Apache为了获得系统资源最大的使用权限,将以特权用户root(*nix系统)
    并且整个过程处于一个单进程单线程的环境中。 这个阶段包括配置文件解析(如http.conf文件)、模块加载(如mod_php,mod_perl)和系统资源初始化(例如日志文件、共享内存段、数据库连接等)等工作。在运行阶段,Apache主要工作是处理用户的服务请求。 在这个阶段,Apache放弃特权用户级别,使用普通权限,这主要是基于安全性的考虑,防止由于代码的缺陷引起的安全漏洞。
    通过Hook机制,将mod_php5的自定义函数注入请求处理循环中,参与php的处理

    3.Apache2的mod_php5模块说明
    Apache中的module结构体,定义了很多成员
    PHP中的mod_php5模块,使用这个结构体定义,并赋值。其中有一个php_dir_cmds的成员,是个数组里面包括了几个php的指令,例如:php_value,php_admin_value等

    Apache定义的结构体:

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

    PHP中对结构体的赋值:

    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_开头的函数在一次请求处理过程中对于指定的步骤注册钩子 */
    };
    
    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}
    };

    我的练习:


    1.C语言数组
    int a[]={1,2,3,4};//整型数组
    char *b[]={"tao","shi","han"};//字符串数组
    printf("%d %s ",a[2],b[0]);

    2.typedef:给类型起一个别名

    int main(){
            //定义结构体
            struct stu{
                    char *name;
                    int age;
                    int (*sum)(int);
            };
            //给类型起个别名
            typedef struct stu STU;
            //1.定义结构体
            STU student;
            student.age=10;
            student.name="taoshihan";
            printf("%s 
    ",student.name);
    }

    3.几个预定义宏:
    printf("%d ",__LINE__);//返回当前行数
    printf("%s ",__FILE__);//返回当前源文件名称

    4.const:禁止修改变量的值,常量

  • 相关阅读:
    LCA问题
    CSP2019 J组 游记
    树的直径
    动态规划-背包问题
    Diworth定理
    扫描线算法
    线段树2:区间乘法实现
    线段树1:区间查询和区间加法
    Sys.WebForms.PageRequestManagerParserErrorException: 常见的原因是:通过调用Response.Write()修改相应时,将启用响应筛选器、HttpModules或服务器追踪
    10 套华丽的 CSS3 按钮推荐
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8290035.html
Copyright © 2020-2023  润新知