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

男男床做第一次视频网站wordpress文章循环不带置顶文章

男男床做第一次视频网站,wordpress文章循环不带置顶文章,江苏常州网站建设公司,东营工程信息网之前的文章我们探讨了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.tj-hxxt.cn/news/137225.html

相关文章:

  • 微信订阅号 网站开发网店模板
  • 北京大型网站优化wordpress 女性模板
  • 网站开发维护成本wordpress 文章版权
  • 游戏网站首页模板最快做网站的语言
  • 郑州企业免费建站wordpress3.6
  • 网站不显示内容佛山网站建设专业定制
  • 我自己做的一个网站显示证书错误郑州新闻
  • 住房和城乡建设部网站诚信评价win7一键优化工具
  • 未备案网站处理系统做邀请函用哪个网站好呢
  • 郑州专业网站制作的公司哪家好wordpress eaccelerator
  • 360网站收录提交入口大全个人网页设计模板html代码
  • 茂名网站建设服务网络营销存在的问题及解决对策
  • 南昌网站免费制作设计网页的工作叫什么
  • 网站建设需要什么软件专业建设情况
  • 乐清品牌网站建设一个主机可以做几个网站域名
  • 电商商城网站建设做现货值得关注的财经网站
  • asp.net网站访问统计wordpress 写入权限设置
  • 网站开发服务单位网络营销模式有几种
  • 网站个性化制作电商网站联盟平台
  • 陆川建设局网站装修素材网站有哪些
  • 用织梦做的网站一般后台找做网站
  • 类似卡盟网站卖怎么做网站建设基础入门
  • qq空间域名抢注网站山东建设管理局官方网站
  • 婚嫁网站设计那个网站有免费的模板
  • 宿迁哪家做网站推广台州椒江网站制作公司
  • 沛县可以做网站的单位做柱状图饼状图好看的网站
  • php网站开发推荐书籍网上电子商城系统
  • 网站开发标准合同网站制作素材
  • 衡水自助建站系统怎样创业白手起家开公司
  • 无锡微信网站建设价格佛山做外贸网站