Nginx 变量漫谈(四)
来源:互联网 发布:如何让皮肤变好 知乎 编辑:程序博客网 时间:2024/04/30 01:06
map $args $foo { default 0; debug 1; } server { listen 8080; location /test { set $orig_foo $foo; set $args debug; echo "orginal foo: ;$orig_foo" echo "foo: $foo" ;} }
这里首次用到了标准 ngx_map 模块的 map 配置指令,我们有必要在此介绍一下。map
在英文中除了“地图”之外,也有“映射”的意思。比方说,中学数学里讲的“函数”就是一种“映射”。而 Nginx 的这个map 指令就可以用于定义两个 Nginx 变量之间的映射关系,或者说是函数关系。回到上面这个例子,我们用map 指令定义了用户变量$foo
与 $args 内建变量之间的映射关系。特别地,用数学上的函数记法 y = f(x)
来说,我们的 $args
就是“自变量”x
,而 $foo
则是“因变量” y
,即 $foo
的值是由$args 的值来决定的,或者按照书写顺序可以说,我们将$args 变量的值映射到了$foo
变量上。
map $args $foo { default 0; debug 1; }
花括号中第一行的 default
是一个特殊的匹配条件,即当其他条件都不匹配的时候,这个条件才匹配。当这个默认条件匹配时,就把“因变量”$foo
映射到值 0
. 而花括号中第二行的意思是说,如果“自变量” $args
精确匹配了debug
这个字符串,则把“因变量” $foo
映射到值 1
. 将这两行合起来,我们就得到如下完整的映射规则:当$args 的值等于debug
的时候,$foo
变量的值就是 1
,否则 $foo
的值就为0
.
location /test
. 在那里,我们先把当前 $foo
变量的值保存在另一个用户变量$orig_foo
中,然后再强行把 $args 的值改写为 debug
,最后我们再用 echo 指令分别输出 $orig_foo
和 $foo
的值。
debug
之后,根据先前的 map 映射规则,$foo
变量此时的值应当自动调整为字符串 1
, 而不论 $foo
原先的值是怎样的。然而测试结果并非如此:
$ curl 'http://localhost:8080/test' original foo: 0 foo: 0
第一行输出指示 $orig_foo
的值为 0
,这正是我们期望的:上面这个请求并没有提供 URL 参数串,于是$args 最初的取值就是空,再根据我们先前定义的映射规则,$foo
变量在第一次被读取时的值就应当是0
(即匹配默认的那个 default
条件)。
debug
之后,$foo
的条件仍然是 0
,这显然不符合映射规则,因为当$args 为debug
时,$foo
的值应当是 1
. 这究竟是为什么呢?
$foo
变量在第一次读取时,根据映射规则计算出的值被缓存住了。刚才我们说过,Nginx 模块可以为其创建的变量选择使用值容器,作为其“取处理程序”计算结果的缓存。显然,ngx_map 模块认为变量间的映射计算足够昂贵,需要自动将因变量的计算结果缓存下来,这样在当前请求的处理过程中如果再次读取这个因变量,Nginx 就可以直接返回缓存住的结果,而不再调用该变量的“取处理程序”再行计算了。
debug
:
$ curl 'http://localhost:8080/test?debug' original foo: 1 foo: 1
我们看到,现在 $orig_foo
的值就成了 1
,因为变量 $foo
在第一次被读取时,自变量$args 的值就是debug
,于是按照映射规则,“取处理程序”计算返回的值便是 1
. 而后续再读取 $foo
的值时,就总是得到被缓存住的1
这个结果,而不论 $args 后来变成什么样了。
server
配置块之外,也就是在最外围的 http
配置块中定义的。很多读者可能会对此感到奇怪,毕竟我们只是在location /test
中用到了它。这倒不是因为我们不想把 map
语句直接挪到 location
配置块中,而是因为map 指令只能在http
块中使用!
location
接口的请求都执行一遍变量值的映射计算,然而事实并非如此。前面我们已经了解到map 配置指令的工作原理是为用户变量注册 “取处理程序”,并且实际的映射计算是在“取处理程序”中完成的,而“取处理程序”只有在该用户变量被实际读取时才会执行(当然,因为缓存的存在,只在请求生命期中的第一次读取中才被执行),所以对于那些根本没有用到相关变量的请求来说,就根本不会执行任何的无用计算。
set $b "$a,$a";
这里会在执行 set 规定的赋值操作时,“主动”地计算出变量 $b
的值,而不会将该求值计算延缓到变量 $b
实际被读取的时候。
转自:http://blog.sina.com.cn/s/blog_6d579ff40100woyb.html
- Nginx 变量漫谈(四)
- Nginx 变量漫谈(一)
- Nginx 变量漫谈(二)
- Nginx 变量漫谈(三)
- Nginx 变量漫谈(五)
- Nginx 变量漫谈(六)
- Nginx 变量漫谈(七)
- Nginx 变量漫谈(八)
- Nginx 变量漫谈(三)
- Nginx 变量漫谈(一)(转)
- 数据可视化漫谈(四)
- 漫谈继承技术(四)
- 【转】漫谈Moq(四)
- nginx脚本引擎与变量设计(四)
- 漫谈Java加密技术(四)
- 漫谈Java加密技术(四)
- nginx 测试(四)
- shell 变量(四)
- 【转】IE 无法使用 js trim() 的解决方法
- 使用SiteScope监控Tomcat
- JS生成随机字符
- linux下安装mysql-python笔记
- 数据库连接池
- Nginx 变量漫谈(四)
- POJ 1595 素数切
- 复合LOV的实现
- BlueTooth的EDR是什么
- 关键路径的实现C++ 代码
- Nginx 变量漫谈(五)
- 中国地质大学24岁硕士可可西里科考时遇难
- java_IO流(黑马程序员)
- 数组的应用大折腾