当前位置: 首页 > news >正文

做优惠券网站如何引流传智播客php网站开发实例教程

做优惠券网站如何引流,传智播客php网站开发实例教程,济南网站建设网站,jquery做背景的网站赏析之前的文章我们探讨了nginx的变量#xff0c;接着就是脚本原理#xff0c;也就是复杂变量#xff0c;理解了前面的实现原理#xff0c;接下来了解if#xff0c;break#xff0c;return,set就要简单多。 指令有不少#xff0c;没必要全部探讨#xff0c;了解了其中之一…之前的文章我们探讨了nginx的变量接着就是脚本原理也就是复杂变量理解了前面的实现原理接下来了解ifbreakreturn,set就要简单多。 指令有不少没必要全部探讨了解了其中之一即可实现基本原理都一样实现方式大同小异。理解了指令实现原理我们就可以开发属于自己的配置指令。 我们以if指令为例配置如下 if($remote127.0.0.1){ #注是 不是 return 200 you request is from local; } 以此来分析nginx是如何编译(翻译)该指令并如何执行的。 题外话我的源码取自angienginx版本为1.25.4 其脚本基本原理不变 将指令翻译成一个个执行单元然后依次执行每个单元 其指令存放在ngx_http_rewrite_loc_conf_t的code数组中后续是否有指令需要执行也是判断此数组是否为空 if指令的实现源码在 ngx_http_rewrite_module.c中此模块在http rewrite阶段实现为什么在此阶段实现可以自行google或bing但是确实有必要去了解下 编译 我们先看if的配置解析函数一开始就是重新建立了一个loc_conf至于为什么就是上面黑字提到的。 其中的ngx_http_rewrite_if_condition则是处理和编译if($remote127.0.0.1)这个条件字符串 大致流程是 找出变量调用ngx_http_rewrite_variable生成其code_t 找到号后的值调用ngx_http_rewrite_value生成其code_t 最后生成号的code_t和if的code_t 1.首先找出表达式中变量 remote和 值 127.0.0.1并顺带判断表达式的合法性 2.调用ngx_http_rewrite_variable为变量remote生成值计算的code_tcode_t取自上面说的code数组,其执行函数为ngx_http_script_var_code。跟之前的复杂变量不同的是这里不需要计算变量长度。 3.提取号后面的常量值或变量或复杂变量我们看处理函数ngx_http_rewrite_value的源码 static char * ngx_http_rewrite_value(ngx_conf_t *cf, ngx_http_rewrite_loc_conf_t *lcf,ngx_str_t *value) {ngx_int_t n;ngx_http_script_compile_t sc;ngx_http_script_value_code_t *val;ngx_http_script_complex_value_code_t *complex;n ngx_http_script_variables_count(value);//获取变量数量if (n 0) {//按常量处理常量值使用val ngx_http_script_start_code(cf-pool, lcf-codes,sizeof(ngx_http_script_value_code_t));if (val NULL) {return NGX_CONF_ERROR;}n ngx_atoi(value-data, value-len);if (n NGX_ERROR) {n 0;}val-code ngx_http_script_value_code;//执行函数val-value (uintptr_t) n;val-text_len (uintptr_t) value-len;//保存常量长度val-text_data (uintptr_t) value-data;//保存常量值首地址return NGX_CONF_OK;}//下面走复杂变量的编译逻辑前面文章有详述这不再解析了complex ngx_http_script_start_code(cf-pool, lcf-codes,sizeof(ngx_http_script_complex_value_code_t));if (complex NULL) {return NGX_CONF_ERROR;}complex-code ngx_http_script_complex_value_code;complex-lengths NULL;ngx_memzero(sc, sizeof(ngx_http_script_compile_t));sc.cf cf;sc.source value;sc.lengths complex-lengths;sc.values lcf-codes;sc.variables n;sc.complete_lengths 1;if (ngx_http_script_compile(sc) ! NGX_OK) {return NGX_CONF_ERROR;}return NGX_CONF_OK; }函数也比较简单号后面的条件是常量还是变量(或复杂变量)如果是常量直接生成ngx_http_script_value_code_t存放常量的值和长度执行函数为ngx_http_script_value_code 然后就是为运算符生成了一个code_t 其执行函数为ngx_http_script_equal_code 最后为if生成一个ngx_http_script_if_code_t其执行函数是ngx_http_script_if_code 到这里的我们配置示例中的if指令就算编译完成了。 执行 从上面的编译不知道大家是否能看出或体会一点点味道熟悉函数调用的可能会体会到似曾相识的感觉。有一种压栈的感觉先把参数和其值压栈再压运算符最后再压入if指令。 接下来我们看执行了我们看ngx_http_rewrite_handler函数 首先是看有没有需要执行的指令即codes数组是否为空。 如果有则生成ngx_http_script_engine_t来执行之前编辑好的指令集。 e-sp ngx_pcalloc(r-pool,                     rlcf-stack_size * sizeof(ngx_http_variable_value_t)); 与前面复杂变量不同的是这里会为engine_t中的sp分配“栈”空间栈大小为 rlcf-stack_size(这个大小是固定的虽然在merge有合并但是未提供配置固定是10)生成可以存储10个变量值的空间类似cpu的sp寄存器。看到这应该有点相似感觉了吧。 engine_t的ip类似cpu的指令寄存器sp类似堆栈寄存器指令执行的结果存放在sp中。前面的复杂变量只用到了ip因此未做解析。 下面看执行也是一样的如下 while (*(uintptr_t *) e-ip) {         code *(ngx_http_script_code_pt *) e-ip;//取当前指令code_t         code(e);        //执行指令函数     } 然后我们逐个来看编译生成的code_t的执行函数 1.执行remote变量的code_t执行函数为ngx_http_script_var_code计算(获取)出remote的值 void ngx_http_script_var_code(ngx_http_script_engine_t *e) {ngx_http_variable_value_t *value;ngx_http_script_var_code_t *code;ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e-request-connection-log, 0,http script var);code (ngx_http_script_var_code_t *) e-ip;//取当前code_te-ip sizeof(ngx_http_script_var_code_t);//ip偏移到下个code_tvalue ngx_http_get_flushed_variable(e-request, code-index);//计算变量值if (value !value-not_found) {ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e-request-connection-log, 0,http script var: \%v\, value);*e-sp *value; //值结果存放到sp中e-sp; //sp偏移到下个位置return;}*e-sp ngx_http_variable_null_value;e-sp; }2.执行等号后的常量值的code_t执行函数为ngx_http_script_value_code void ngx_http_script_value_code(ngx_http_script_engine_t *e) {ngx_http_script_value_code_t  *code;code (ngx_http_script_value_code_t *) e-ip;//获取当前code_te-ip sizeof(ngx_http_script_value_code_t);//ip偏移到下个code_te-sp-len code-text_len;//由于此code_t是常量其值直接存入sp中e-sp-data (u_char *) code-text_data;ngx_log_debug1(NGX_LOG_DEBUG_HTTP, e-request-connection-log, 0,http script value: \%v\, e-sp);e-sp;//sp偏移到下个位置 } 3.执行等号code_t执行函数ngx_http_script_equal_code void ngx_http_script_equal_code(ngx_http_script_engine_t *e) {ngx_http_variable_value_t *val, *res;ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e-request-connection-log, 0,http script equal);e-sp--; //sp回退val e-sp; //取到值res e-sp - 1;//取变量e-ip sizeof(uintptr_t);//判断变量和值是否相等if (val-len res-len ngx_strncmp(val-data, res-data, res-len) 0){*res ngx_http_variable_true_value;//相等则设置为true值将remote的值设置为truereturn;}ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e-request-connection-log, 0,http script equal: no);*res ngx_http_variable_null_value;//不等则置为空值 } 4.最后执行if指令的code_t执行函数ngx_http_script_if_code void ngx_http_script_if_code(ngx_http_script_engine_t *e) {ngx_http_script_if_code_t  *code;code (ngx_http_script_if_code_t *) e-ip;//取if_codengx_log_debug0(NGX_LOG_DEBUG_HTTP, e-request-connection-log, 0,http script if);e-sp--;//这里为什么还要回退呢前面的等号运算符的执行回退了一次执行了值的sp再回退一次指 //向了remote的spif (e-sp-len (e-sp-len ! 1 || e-sp-data[0] ! 0)) {if (code-loc_conf) {e-request-loc_conf code-loc_conf;ngx_http_update_location_config(e-request);//这里需要更新location}//第一个值有效则 当前判断成功指向下个指令即if()后{}里面的指令在这里就是指向 //return的code_te-ip sizeof(ngx_http_script_if_code_t);return;}ngx_log_debug0(NGX_LOG_DEBUG_HTTP, e-request-connection-log, 0,http script if: false);e-ip code-next;// } 整个if的执行就到此结束了接下来要执行的就是我们if条件成立后{}内部的指令了。 总结如下 编译 1.生成运算符等号前变量的code_t(运算符前面的必须是变量源码就是这样实现的) 2.生成运算符后的值code_t值可以是常量变量复杂变量。 3.生成运算符的code_t 4.生成if的code_t 执行 逐个执行code的函数最终结果的处理逻辑是由if_code_t执行函数来完成的。 但是欲彻底理解就如我前面提到的必须了解这些指令为什么要在rewrite阶段而不其他阶段nginx的框架是如此设计的具体的原因也不是几句话能说清楚的文章篇幅有限本文直将if指令的实现其他的自行google和bing 在此感谢大家的关注和点赞若有描述不妥或不正确不准确的希望评论区指正感谢~
http://www.w-s-a.com/news/827583/

相关文章:

  • 深圳网站设计十年乐云seo网站建设 竞赛 方案
  • 新乡移动网站建设wordpress输出某一分类的文章
  • 花店网站开发设计的项目结构重庆网站建设培训班
  • 做网站的技术体系投资者互动平台官网
  • 北京网站建设公司哪家实惠企查查在线查询入口
  • 毕业设计做网站怎么样非微信官方网页自己做的网站
  • 昆明网站多端小程序设计重庆市住房和城乡建设厅网站
  • 网站制作技术人员国际新闻最新10条
  • 做同城特价的网站wordpress后台能修改模板文件
  • 网站信息可以边建设边组织产品展示网站源码php
  • 电子商务网站规划从哪些方面入手途牛企业网站建设方案
  • 莱阳网站定制易语言可以做网站嘛
  • 购物网站开发意义上海中小企业服务中心官网
  • 网站备案证书如何打开江苏网站建设电话
  • 深圳网站建设乐云seo搜索引擎优化seo目的
  • 中山城市建设集团网站网站建设设计基础
  • 网站开发流程莆田wordpress点播收费
  • 网站未及时续费浙江台州做网站的公司有哪些
  • 二级域名做网站好不好河源建网站
  • 公司网站的作用意义维护建设管理天津平台网站建设费用
  • 建设部网站如何下载国标规范上海影视公司
  • 企业官方网站地址通了网站建设
  • 专题网站可以做什么怎么做网站滑动图片部分h5
  • 什么是网站建设外包html 门户网站
  • 资阳市建设局网站微信开发公司
  • wap建站程序源码可不可以异地建设网站
  • 优秀企业网站的特点网站标签名词
  • 建材网站建设案例淄博网站建设培训
  • 纯代码添加wordpress网站底部导航宝塔自助建站源码
  • 网站设计技术有哪些?青岛网站建设工作室