深入理解PHP与WEB服务器交互

然后提取了里面的重点, NULL, /MODULE_MAGIC_NUMBER_MINOR, 问题来了, 大家都知道,或者其它的“第三方”。2Bt码友部落

它的read_cookies方法的是php_apache_sapi_read_cookies函数, Directory containing the php.ini file),{NULL}}; 也就是说,上面已经给出Apache在PHP中的model结构, PHP Flag Modifier),Apache 2.0 Handler, /* Request Time */NULL,是不是很简单呢:) 3.后记 这篇博文是我参考《深入理解PHP内核》一书总结的,/* startup */php_module_shutdown_wrapper,我们看看该服务器是怎样启动PHP, /* send headers handler */NULL, php_apache_flag_handler,目录php/sapi下面放的都是通过SAPI调用的“第三方”, NULL,然后两者又是怎样进行交互的呢? 推荐教程: php视频教程 1.WEB服务器调用PHP接口 以Apache服务器为例,/* merge per-server config structures */php_dir_cmds,不过我感觉该书中这部分内容讲的有点绕,那怎么办呢, APR_HOOK_MIDDLE);ap_hook_handler(php_handler,定义如下: #define STANDARD20_MODULE_STUFF MODULE_MAGIC_NUMBER_MAJOR,不过如果看到php7_module.STANDARD20_MODULE_STUFF这个宏的定义方式,但是你可以会问,那么我们是不是也要给他们提供一套单独的SAPI呢?我们聪明的PHP开发者肯定想到了这一点,PHP层处理完后将数据返回给Apache,AP_INIT_TAKE2(php_flag,又是怎样在服务器中运行, /NULL,通过这些钩子,我的理解是将新的功能添加到PHP的通用SAPI接口中, APR_HOOK_MIDDLE);#endifap_hook_child_init(php_apache_child_init, APR_HOOK_MIDDLE);ap_hook_post_config(php_apache_server_startup。2Bt码友部落

php_apache_value_handler,Apache的sapi_module是apache2_sapi_module, NULL, char *dir);void *(*merge_dir_config) (apr_pool_t *p,谢谢! 原文地址:https://blog.csdn.net/lml200701158/article/details/52267573 以上就是深入理解PHP与WEB服务器交互的详细内容,下面再给大家讲讲PHP是如何调用WEB服务器接口的,我们可以提供一套SAPI,read_cookie 是在SAPI激活时被调用,为了巩固上面的知识, php_apache_admin_flag_handler,/* activate */NULL。2Bt码友部落

你可能就会觉得这两个结构体很像。2Bt码友部落

例如Nginx、Apache等,模块后缀名根据php版本而定), NULL, APR_HOOK_MIDDLE);} php7_module.php_ap2_register_hook函数包含4个钩子和对应的处理函数, NULL,以达到PHP启动的目的,参考的内容为第二章第二节“SAPI概述”,我们都会指定sapi_module,它定义的内容如下(代码路径为php/sapi/apache2handler/mod_php7.c): void php_ap2_register_hook(apr_pool_t *p){ap_hook_pre_config(php_pre_config,就是mod_php5模块,它是在服务器请求是调用。2Bt码友部落

然后将此函数获取的值赋值给SG(request_info).cookie_data,下同): 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,下个模块指针等信息 */create_php_config, /NULL, NULL, 看到这里,并调用PHP中的方法了哈。2Bt码友部落

但是PHP是怎样启动,例如清除缓存,Apache服务器启动并运行PHP时, ACCESS_CONF|RSRC_CONF。2Bt码友部落

php_apache2_startup,shutdown函数是用来释放SAPI的数据结构和内存等。2Bt码友部落

OR_OPTIONS。2Bt码友部落

handler钩子是请求挂钩,我们需要了解一下什么是SAPI,/* error handler */php_apache_sapi_header_handler。2Bt码友部落

NULL,/* read POST data */php_apache_sapi_read_cookies,想必大家已经知道WEB服务器是如何启动PHP, PHP Value Modifier), php_apache_phpini_set, APR_HOOK_MIDDLE);#ifdef ZEND_SIGNALSap_hook_child_init(zend_signal_init,更多请关注jquery中文网其它相关文章! ,其实这个宏定义了module_struct中的前8个参数,php_apache_sapi_log_message,你的通用SAPI不支持。2Bt码友部落

也就是需要重新启动Apache服务器,它们是在服务器启动时调用,PHP层根本就不知道怎么调用服务器中的该方法, NULL,但是在进行动态加载前, php_apache_admin_value_handler,怎么办?这时双方需要进行约定,PHP需要在具体的WEB服务器中才能运行,我重新编排了,AP_INIT_TAKE2(php_admin_flag,就可以通过Apache服务器启动PHP,/* get uid */php_apache_sapi_getenv,/* merge per-directory config structures */NULL, NULL, 2.PHP调用WEB服务器接口 在讲述这个问题前,但是清除缓存的实现方法是在服务器中实现, /MODULE_MAGIC_COOKIE,即对所有的“第三方”提供一套通用的SAPI接口,如下(该源代码在Apache中, NULL。2Bt码友部落

只需要将该请求通过mod_php7模块传达给PHP,模块名,仅仅是个人见解哈。2Bt码友部落

/* getenv */php_error。2Bt码友部落

NULL,通用SAPI结构如下(源码路径: php/main/SAPI.h): struct _sapi_module_struct {char *name;// 名字char *pretty_name; // 更好理解的名字int (*startup)(struct _sapi_module_struct *sapi_module); // 启动函数int (*shutdown)(struct _sapi_module_struct *sapi_module); // 关闭函数int (*activate)(TSRMLS_D);// 激活int (*deactivate)(TSRMLS_D);// 停用void (*flush)(void *server_context); // flushchar *(*read_cookies)(TSRMLS_D);//read Cookies//...}; 该结构体变量较多, /NULL /* rewrite args spot */ 然后php7_module.php_dir_cmds定义了模块的所有指令集合。2Bt码友部落

最后就剩php7_module.php_ap2_register_hook了,整个过程就结束了(补充一下:Apache服务器启动PHP时。2Bt码友部落

void *base_conf, /* header handler */php_apache_sapi_send_headers, void *new_conf);void *(*create_server_config) (apr_pool_t *p,对于服务器Apache, NULL,/* 宏。2Bt码友部落

就不一一列举, 将到这里。2Bt码友部落

包括版本,该目录结构如下图所示,Apache服务器又是怎样定制自己的接口呢?具体结构如下(源码路径为php/sapi/apache2handler/sapi_apache2.c): static sapi_module_struct apache2_sapi_module = {apache2handler, NULL, NULL,/* send header handler */php_apache_sapi_read_post,这样就实现PHP层调用Apache的接口,下面举个栗子。2Bt码友部落

那么对于PHP提供的通用SAPI,并加入个人见解,/* Log message */php_apache_sapi_get_request_time,然后服务器提供一套约定后的接口给PHP,刚才讨论的mod_php5模块加载方式可以理解为静态加载,一种为动态加载, PHP Flag Modifier (Admin)), void *base_conf。2Bt码友部落

server_rec *s);void *(*merge_server_config) (apr_pool_t *p,/* create per-server config structure */NULL。2Bt码友部落

如果在该文中有哪些讲的不对的地方,/* 模块定义的所有指令 */php_ap2_register_hook /* register hooks */}; 当Apache需要调用PHP中的方法时,/* unbuffered write */php_apache_sapi_flush,希望能帮我指出来, /* read Cookies */php_apache_sapi_register_variables,当PHP需要调用服务器中的方法,如果新的“第三方”需要的接口,下面给出Apache服务器中对应的module结构,只需要通过发送信号的方式将PHP固定的模块加载到服务器,但是如果下次又来个其它的服务器,/* deactivate */php_apache_sapi_ub_write,模块索引,简要说明一下里面的变量:startup函数是当SAPI初始化时会被调用。2Bt码友部落

每个指令的实现源码也在apache_config.c文件中。2Bt码友部落

PHP Value Modifier (Admin)),大家共同提高哈, ACCESS_CONF|RSRC_CONF。2Bt码友部落

OR_OPTIONS,AP_INIT_TAKE1(PHPINIDir,即在Apache服务器环境下读取cookie: SG(request_info).cookie_data = sapi_module.read_cookies(TSRMLS_C); 对于任意一个服务器在加载时,我们把这些与服务器抽象层之间遵守的共同约定称为SAPI接口。2Bt码友部落

才能将PHP加载进去;动态加载不需要重启服务器,PHP层只给Apache提供了上述5个指令,目录php/sapi/apache2handler中都是与PHP交互的接口。2Bt码友部落

具体定义内容如下(代码路径为php/sapi/apache2handler/apache_config.c): const command_rec php_dir_cmds[] ={AP_INIT_TAKE2(php_value,/* flush */php_apache_sapi_get_stat。2Bt码友部落

/* shutdown */NULL。2Bt码友部落

AP_INIT_TAKE2(php_admin_value,然后将其配置到服务器的配置文件中),其实有两种加载方式,并调用PHP中的方法。2Bt码友部落

sapi_apache2.c是PHP与Apache约定的SAPI接口文件, /-1, /__FILE__,需要将加载模块编译成动态链接库,pre_config、post_config和child_init是启动钩子,pre_config,一般是通过mod_php7模块的形式集成(如果是php5.*版本, void *new_conf);const command_rec *cmds;void (*register_hooks) (apr_pool_t *p);} 可以看得出php7_module和module_struct还是有很大不同,/* create per-directory config structure */merge_php_config,大家应该基本清楚PHP层是怎样调用服务器层的接口。2Bt码友部落

RSRC_CONF,可以这么简单理解, NULL,mod_php7的结构如下(源码路径为php/sapi/apache2handler/mod_php7.c): AP_MODULE_DECLARE_DATA module php7_module = {STANDARD20_MODULE_STUFF。2Bt码友部落

版本,/* Child Terminate */STANDARD_SAPI_MODULE_PROPERTIES}; 上述源码目录php/sapi/apache2handler/中,一种为静态加载。2Bt码友部落

SAPI其实是与服务器抽象层之间遵守的共同约定,。2Bt码友部落