ngx.var与ngx.ctx的区别
ngx.var
- ngx.var 需预定义方可使用, 一般都写在 ngx 或 openresty 的conf 内 ngx.var;
- 在conf内可以使用set 方式创建变量;
- ngx.var 可以定义在location内,也可以定义在server 内;
- 在lua 代码使用时,需要 ngx.var.xxx 引用;
- ngx.var.xxx = nil 表示删除。
server {$listen 80;server_name test.jinbo.com;set $c 666;location /foo {set $a 12;set $b '';rewrite_by_lua_block {ngx.var.b = tonumber(ngx.var.a) + 12;}content_by_lua_block {ngx.say("b = ", ngx.var.b);ngx.say("c =", ngx.var.c);}location / {echo $args;echo $a;echo $b;echo $c;}}
}#结果如下:
curl 'http://test.jinbo.com/foo'
b = 24
c =666curl 'http://test.jinbo.com?abc=def'
abc=def666
从上边的例子可以看出如何定义ngx.var变量;也能发现ngx.var的作用域范围:
ngx.var.c 这个变量,作用域范围为所有的location,即贯穿所有的请求;
ngx.var.a 与 ngx.var.b, 作用域范围为 “location /foo”。
ngx.ctx
需在ngx_lua 模块上下文定义使用, 变量作用域属于单个location,如下例子:
location /test_ctx {rewrite_by_lua_block {ngx.ctx.foo = 660}access_by_lua_block {ngx.ctx.test = 6ngx.ctx.foo = ngx.ctx.foo + ngx.ctx.test}content_by_lua_block {ngx.ctx.result = ngx.ctx.foongx.say(ngx.ctx.result)}
} #结果如下:
curl 'http://test.qunar.com/test_ctx'
666
从上边的例子看出 ngx.ctx变量在整个location lua 模块内“动态创建变量”;
也说明仅能在当前的请求内共享变量。
其他网络区别
ngx.var 是获取 Nginx 的变量,需要经历字符串 hash、hash 表查找等过程
ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ctx_ref)
使用 ngx.ctx 比 ngx.var 往往是更好的选择
作者:tokers
链接:https://www.zhihu.com/question/43196128/answer/173513231
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
ngx.var与ngx.ctx的区别相关推荐
- nginx的 ngx.var ngx.ctx ngx.req
ngx.var 是获取 Nginx 的变量,需要经历字符串 hash.hash 表查找等过程 ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lua 的模块上下文(ctx ...
- nginx变量ngx.var
ngx.var 是获取 Nginx 的变量,类型是字符串或nil,需要经历字符串 hash.hash 表查找等过程. ngx.ctx 仅仅是一个 Lua table 而已,它的引用存放在 ngx_lu ...
- 由一条OpenResty Error log谈谈ngx.exit与ngx.eof的区别
事由 我们基于Vanilla开发了一个类似于一个网关的流量分发服务,在原来的业务线上对不同的业务使用不同的后端(PHP.Python.Lua...)进行处理,最近在紧锣密鼓的测试(当然这里咱们主要看问 ...
- JavaScript重难点解析1(数据类型——var、let、const区别,类型补充,“===”、“typeof”、“instanceof”区别,Symbol数据类型)
JavaScript重难点解析1(数据类型) var.let.const区别: 类型补充 "==="."typeof"."instanceof&quo ...
- java 全局变量_Javascript中的局部变量、全局变量的详解与var、let的使用区别
前言 Javascript中的变量定义方式有以下三种方式: 1.直接定义变量,var与let均不写: a = 10; 2.使用var关键字定义变量 var a = 10; 3.使用let关键字定义变量 ...
- javasript中var、let和const区别
let和const都是es5,es6新版本的js语言规范出来的定义,在这以前定义一个变量只能用var.let和const都是为了弥补var的一些缺陷而新设计出来的. 简单来说是: let是修复了var ...
- var、let 及 const 区别
var console.log(a) // undefinedvar a = 1 从上述代码中我们可以发现,虽然变量还没有被声明,但是我们却可以使用这个未被声明的变量,这种情况就叫做提升,并且提升的是 ...
- JavaScript 中 var 、let、const区别
问题 var . let. const 都可以用来声明变量,那么它们的区别是什么? 思考思路 变量的数据类型(数字,字符串,数组 and so on) 变量的作用域 ( 全局 or 局部 or 某个代 ...
- ngx.print与ngx.say
--输出响应内容体:(内容体结束后没有换行符:) ngx.print("aaaaaaaaaaaaaa")--输出响应内容体:(内容体结束后,输出一个换行符:) ngx.say(&q ...
最新文章
- Android开发之自定义Dialog二次打开报错问题解决
- 給曾經的三年,寫點什么吧。-紀念華軟
- linux下dump命令,Linux dump命令
- 所选驱动器不再有效,继续安装之前,请先检查安装路径的设置
- java nio集群_java – Hazelcast:连接到远程集群
- Google File System 学习笔记
- java 0xf0_java 中类似js encodeURIComponent 函数的实现案例
- Hbase问题汇总与解答
- CMD中文显示为乱码
- php 实用 函数,PHP实用函数9
- error: ‘avcodec_alloc_frame’ was not declared in this scope
- ArcGIS+Google Earth Pro 经纬度标点地图
- 怎么停止skywalking_SkyWalking 告警设置
- SAP系统配置SMPT邮箱
- Spire.Doc利用word样式读取word文字内容(.NET)
- 自媒体平台有哪些---(特点及优缺点)
- js调用(前/后)摄像头,截取照片,关闭摄像头
- 香港主要房产公司计划寻求监管机构对代币化房地产的许可
- is running 8724480B beyond the ‘PHYSICAL‘ memory limit.
- Hyperledger Fabric 1.0 快速搭建 -------- 多机部署 Fabric CA节点服务