vim阅读apache的mod_php

创建tags 文件:
php-5.3.3 目录下:
ctags -R .
ctags -R -a -f tags /path/to/httpd-2.2.16
如果需要tags使用绝对路径,则可以使用参数:
–tag-relative=no

1. mod_php.c的写法,主要是定义一些函数,然后通过模块结构体变量挂到apache的钩子上:

php-5.3.3/sapi/apache/mod_php5.c
  1.     
    //…

        

  2.     
    // 1. 这个结构的名字php5_module是有严格要求的

        

  3.     
    module MODULE_VAR_EXPORT php5_module =

        

  4.     
    {

        

  5.     
        STANDARD_MODULE_STUFF,

        

  6.     
        php_init_handler,           /* initializer */

        

  7.     
        php_create_dir,             /* per-directory config creator */

        

  8.     
        php_merge_dir,              /* dir merger */

        

  9.     
        NULL,                       /* per-server config creator */

        

  10.     
        NULL,                       /* merge server config */

        

  11.     
        php_commands,               /* command table */

        

  12.     
        php_handlers,               /* handlers */

        

  13.     
        NULL,                       /* filename translation */

        

  14.     
        NULL,                       /* check_user_id */

        

  15.     
        NULL,                       /* check auth */

        

  16.     
        NULL,                       /* check access */

        

  17.     
        NULL,                       /* type_checker */

        

  18.     
        NULL,                       /* fixups */

        

  19.     
        NULL                        /* logger */

        

  20.     
    #if MODULE_MAGIC_NUMBER >= 19970103

        

  21.     
        , NULL                      /* header parser */

        

  22.     
    #endif

        

  23.     
    #if MODULE_MAGIC_NUMBER >= 19970719

        

  24.     
        , NULL                      /* child_init */

        

  25.     
    #endif

        

  26.     
    #if MODULE_MAGIC_NUMBER >= 19970728

        

  27.     
        , php_child_exit_handler        /* child_exit */

        

  28.     
    #endif

        

  29.     
    #if MODULE_MAGIC_NUMBER >= 19970902

        

  30.     
        , NULL                      /* post read-request *

        

  31.     
    #endif

        

  32.     
    };

        

2. apache模块结构的定义:

http-2.216/include/http_config.h
  1.     
    typedef struct module_struct module;

        

  2.     
    struct module_struct {          

        

  3.     
        /** API version, *not* module version; check that module is

        

  4.     
         * compatible with this version of the server.

        

  5.     
         */

        

  6.     
        int version;                

        

  7.     
        /** API minor version. Provides API feature milestones. Not checked

        

  8.     
         *  during module init */  

        

  9.     
        int minor_version;

        

  10.     
        /** Index to this modules structures in config vectors.  default -1*/

        

  11.     
        int module_index;

        

  12.     
     

        

  13.     
        /** The name of the module’s C file */

        

  14.     
        const char *name;

        

  15.     
        /** The handle for the DSO.  Internal use only , default null*/

        

  16.     
        void *dynamic_load_handle;

        

  17.     
                                                                                                         

        

  18.     
        /** A pointer to the next module in the list                                                    

        

  19.     
         *  @defvar module_struct *next , default null*/                                                              

        

  20.     
        struct module_struct *next;                                                                      

        

  21.     
                                                                                                         

        

  22.     
        /** Magic Cookie to identify a module structure;  It’s mainly                                    

        

  23.     
         *  important for the DSO facility (see also mod_so).  */                                        

        

  24.     
        unsigned long magic;                                                                            

        

  25.     
                                                                                                         

        

  26.     
        /** Function to allow MPMs to re-write command line arguments.  This                            

        

  27.     
         *  hook is only available to MPMs.                                                              

        

  28.     
         *  @param The process that the server is running in.                                            

        

  29.     
                                                                   

        

  30.     
         */

        

  31.     
        void (*rewrite_args) (process_rec *process);

        

  32.     
        /** Function to allow all modules to create per directory configuration

        

  33.     
         *  structures.

        

  34.     
         *  @param p The pool to use for all allocations.

        

  35.     
         *  @param dir The directory currently being processed.

        

  36.     
         *  @return The per-directory structure created

        

  37.     
         */

        

  38.     
        void *(*create_dir_config) (apr_pool_t *p, char *dir);

        

  39.     
        /** Function to allow all modules to merge the per directory configuration

        

  40.     
         *  structures for two directories.

        

  41.     
         *  @param p The pool to use for all allocations.

        

  42.     
         *  @param base_conf The directory structure created for the parent directory.

        

  43.     
         *  @param new_conf The directory structure currently being processed.

        

  44.     
         *  @return The new per-directory structure created

        

  45.     
         */                                                                                              

        

  46.     
        void *(*merge_dir_config) (apr_pool_t *p, void *base_conf, void *new_conf);                      

        

  47.     
        /** Function to allow all modules to create per server configuration                            

        

  48.     
         *  structures.                                                                                  

        

  49.     
         *  @param p The pool to use for all allocations.                                                

        

  50.     
         *  @param s The server currently being processed.                                              

        

  51.     
         *  @return The per-server structure created                                                    

        

  52.     
         */                                                                                              

        

  53.     
        void *(*create_server_config) (apr_pool_t *p, server_rec *s);                                    

        

  54.     
        /** Function to allow all modules to merge the per server configuration                          

        

  55.     
         *  structures for two servers.                                                        

        

  56.     
         *  @param p The pool to use for all allocations.

        

  57.     
         *  @param base_conf The directory structure created for the parent directory.

        

  58.     
         *  @param new_conf The directory structure currently being processed.

        

  59.     
         *  @return The new per-directory structure created                                              

        

  60.     
         */                                                                                              

        

  61.     
        void *(*merge_server_config) (apr_pool_t *p, void *base_conf,                                    

        

  62.     
                                      void *new_conf);                                                  

        

  63.     
                                                                                                         

        

  64.     
        /** A command_rec table that describes all of the directives this module                        

        

  65.     
         * defines. */                                                                                  

        

  66.     
        const command_rec *cmds;                                                                        

        

  67.     
                                                                                                         

        

  68.     
        /** A hook to allow modules to hook other points in the request processing.                      

        

  69.     
         *  In this function, modules should call the ap_hook_*() functions to                          

        

  70.     
         *  register an interest in a specific step in processing the current                            

        

  71.     
         *  request.                                                                                    

        

  72.     
         *  @param p the pool to use for all allocations                                                

        

  73.     
         */                                                                                              

        

  74.     
        void (*register_hooks) (apr_pool_t *p);                                                          

        

  75.     
    };                                        

        

3. apache动态加载模块的过程。 动态加载模块时,严格检查模块名,包括httpd.conf中的module name(如: php5_module);对应的apache模块定义所在的文件的文件名(如: mod_php5.c)也是严格检查的。

httpd-2.2.16/modules/mappers/mod_so.c
  1.     
    static const char *load_module(cmd_parms *cmd, void *dummy,

        

  2.     
                                   const char *modname, const char *filename)

        

  3.     
    {

        

  4.     
        apr_dso_handle_t *modhandle;

        

  5.     
        apr_dso_handle_sym_t modsym;

        

  6.     
        module *modp;

        

  7.     
        const char *szModuleFile = ap_server_root_relative(cmd->pool, filename);

        

  8.     
        so_server_conf *sconf;

        

  9.     
        ap_module_symbol_t *modi;

        

  10.     
    //…

        

4. Apache conf 中的配置:
LoadModule php5_module        modules/libphp5.so

5. apr 动态加载模块并获取指定符号(如:php5_module):

apr-1.4.2/dso/beos/dso.c
  1.     
     

        

  2.     
    APR_DECLARE(apr_status_t) apr_dso_sym(apr_dso_handle_sym_t *ressym, apr_dso_handle_t *handle,

        

  3.     
                   const char *symname)

        

  4.     
    {

        

  5.     
        int err;

        

  6.     
     

        

  7.     
        if (symname == NULL)

        

  8.     
            return APR_ESYMNOTFOUND;

        

  9.     
     

        

  10.     
        err = get_image_symbol(handle->handle, symname, B_SYMBOL_TYPE_ANY,

        

  11.     
                 ressym);

        

  12.     
     

        

  13.     
        if(err != B_OK)

        

  14.     
            return APR_ESYMNOTFOUND;

        

  15.     
     

        

  16.     
        return APR_SUCCESS;

        

  17.     
    }

        

6. 一切准备完毕后:
   将模块写入已加载的模块列表中: ap_add_loaded_module(modp, cmd->pool);
   注册相关钩子函数:
     apr_pool_cleanup_register(cmd->pool, modi, unload_module, apr_pool_cleanup_null);
   Finally we need to run the configuration process for the module
     ap_single_module_configure(cmd->pool, cmd->server, modp); 

留下评论

邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据