nginx(4)变量转载自章亦春

来源:互联网 发布:自制简易linux操作系统 编辑:程序博客网 时间:2024/06/12 19:04

在设置了"取处理程序“的时候,nginx变量也可以选择将其值容器用作缓存,这样在多次读取变量的时候,就只需要调用”取处理程序“计算一次。我们下面就来看这样的例子:


map $args $foo {

default  0;

debug 1;

}


server {

listen 8080;


location /test {

set $orig_foo $foo;

set $args debug;


echo "original foo:$orig_foo";

echo "foo: $foo";

}

}

这里首次用到标准ngx_map模块的map这配置指令,我们有必要在这里介绍一下。map英文除了”地图“的意思,还有”映射“的意思。比方说,中学数学中讲的”函数“就是一种”映射“。而nginx的这个map指令就可以用于定义两个nginx变量之间的映射关系,或者说是函数关系。回到上面的这个例子,我们用map指令定义了用户变量$foo与内建变量之间的映射关系。特别地,用数学上的函数记法y=f(x)来说,我们的$args就是”自变量“x,而$foo则是”因变量y,即$foo 的值是由$args的值来决定的,或着按照书写的顺序可以说,我们讲$args变量的值映射到了$foo变量上。


现在我们再来看map指令定义的映射规则:

map $args $foo{

default 0;

debug 1;

}

花括号中第一行的default是一个特殊的匹配条件,即当其他条件都不匹配时候,这个条件才匹配。当这个默认条件匹配时,就把“因变量”$foo映射到值0.而花括号中第二行的意思是说,如果“自变量”$args精确匹配了debug这个字符串,则把"因变量“ $foo 映射到值1.讲这两行合起来,我们就得到了如下完整的映射规则:当$args的值等于debug的时候,$foo 变量的值就是1,否则$foo 的值就是0。

明白了map指令的含义,再来看location /test。在那里,我们先把当前$foo变量的值保存在另一个用户变量$orig_foo中,然后在强行把$args的值改写为debug,最后我们再用echo指令分别输出$orig_foo和$foo的值。

从逻辑上来看,视乎当我们强行改写$args的值为debug之后,根据先前的map映射规则,$foo变量此时的值应当自动调整为字符串1,而不论$foo原先的值是怎么样的。然而测试结果并非如此:

$ curl 'http://localhost"8080/test'

original foo : 0

foo :0

第一行输出指示$orig_foo的值为0,这正是我们期望的:上面的这个请求并没有提供URL参数串,于是$args最初的取值就是空,再根据我们先前定义定义的映射规则,$foo变量再第一次被读取时的值就应当时0(即匹配默认的那个default条件)。

而第二行输出显示,在强行改写$args变量的值为字符串debug之后,$foo 的条件仍然是0,这显然不符合映射规则,应为当$args为debug之后,$foo的值应当是1.这究竟是怎么回事?

就是在$foo 变量在第一次读取时,根据映射规则计算出的值被缓存住了。刚才我们说过,nginx模块可以为其创建的变量选择使用值容器,作为其”取处理程序“计算结果的缓存。显然,ngx_map模块认为变量间的映射计算足够再次读取这个因变量,nginx就可以直接返回缓存住的结果,而不再调用该变量的”取处理程序“再行计算了。

原创粉丝点击