本来想写一下nginx的脚本引擎的,但是看起来实在是有点庞大,一时间还不知道该从哪里写比较好。就先写一下他的变量系统吧,这是脚本引擎非常重要的组成部分。

首先为了表述清楚先规定几个术语吧

内置变量:nginx配置文件里不用set就可以直接用的变量。(比如$uri/$host等)

先看带缓存的内置变量

第一步:nginx在初始化模块的时候会建立内置变量数组cmcf->variables_keys,元素的值里有回调函数,用来取变量的值。

第二步:扫描配置文件,把配置文件里会用到的变量建立一个数组cmcf->variables。

第三步:扫描cmcf->variables_keys数组和cmcf->variables数组,建立一个对应关系。把所有cmcf->variables的元素的索引写到相对应的cmcf->variables_keys值的index字段。

先举个例子,假如你在配置文件里用到了$uri这个变量,第二步nginx就会把uri这个变量写到cmcf->variables数组,再假如uri在cmcf->variables数组的索引是2,第三步就会把cmcf->variables_keys对应uri的这个变量的值的index字段赋值成2。

第四步:为了加快查找速度,把cmcf->variables_key数组转化成哈希表cmcf->variables_hash。

编译脚本代码的部分先略过。

第五步:当http请求来的时候会申请一个和cmcf->variables等大小的数组r->variables,这个就是变量缓存,用来存储当前请求的变量值的(内置变量是和http请求相关的,比如说对于某个请求$host变量的值是www.foo.com,对于另一个请求$host的值又变成了www.bar.com)。

第六步:当处理某个http请求并且需要某个变量的时候就从cmcf->variables_hash查找变量的index值找到缓存r->variables,如果缓存r->variables不存在就用cmcf->variables_hash里的回调函数取值存到r->variables里,下次再用就可以直接读缓存。(这里面包含了编译脚本的和执行脚本的步骤,这次先不写了)。

此外还有不带缓存的内置变量,与带缓存的内置变量不同的地方就是他不会在r->variables里设置缓存,每次使用都会调用回调函数,比如http_系列/cookie_系列/upstream_http_系列/upstream_cookie_系列等。

最新文章

  1. 谢欣伦 - OpenDev原创教程 - 蓝牙设备查找类CxBthRemoteDeviceFind
  2. 第五百七十七天 how can I 坚持
  3. uva 10252 - Common Permutation 字符串水题
  4. 琐碎-关于hadoop的GenericOptionsParser类
  5. C#知识总结
  6. C# XML 根级别上的数据无效
  7. JSTL入门
  8. Webapi文档描述-swagger优化
  9. python3全栈开发-什么是粘包、粘包现象、如何解决粘包
  10. 也谈Reactor模式
  11. freetypeLCD显示
  12. 深度理解 React Suspense(附源码解析)
  13. PHP中使用Redis长连接笔记
  14. HDU 3746 - Cyclic Nacklace & HDU 1358 - Period - [KMP求最小循环节]
  15. C#DataGridView的简单使用
  16. java开发编译器:中间语言格式
  17. 多表批量导出txt及打压缩包下载
  18. Python接通图灵机器人
  19. swift - UISegmentedControl 和 UIWebView 的用法
  20. 把mac地址转换为标准mac地址

热门文章

  1. SpringSecurity中的Authentication信息与登录流程
  2. Activiti7 绑定业务主键以及流程定义 流程实例的挂起和激活
  3. 给EmpMapper开放Restful接口
  4. 让mvn打包时跳过Junit测试
  5. 启动Tomcat服务器端口被占用解决方法
  6. JVM执行子程序
  7. mysql 5.7密码策略和安装密码校验插件validate_password
  8. 将HBase中的表加载到hive中
  9. Erlang+RabbitMQ Server的详细安装
  10. Flutter学习四之实现一个支持刷新加载的列表