OpenResty不同阶段共享变量

在OpenResty的体系中,可以通过共享内存的方式完成不同工作进程的数据共享,可以通过Lua方法完成单个工作进程内不同请求的数据共享。那么,如何完成单个请求不同阶段的数据共享呢?

ngx.ctx

通过一个例子,我们来看一下ngx.ctx的应用:

location /test {
     rewrite_by_lua_block {
         ngx.ctx.foo = 76
     }
     access_by_lua_block {
         ngx.ctx.foo = ngx.ctx.foo + 3
     }
     content_by_lua_block {
         ngx.say(ngx.ctx.foo)
     }
}

其实这就是一个lua表,可以随意的添加数据,它的生存周期是单个请求。这里注意,如果包含子请求,那么子请求的ngx.ctx是单独的。

例子:

location /sub {
   content_by_lua_block {
       ngx.say("sub pre: ", ngx.ctx.blah)
       ngx.ctx.blah = 32
       ngx.say("sub post: ", ngx.ctx.blah)
   }
}

location /main {
   content_by_lua_block {
       ngx.ctx.blah = 73
       ngx.say("main pre: ", ngx.ctx.blah)
       local res = ngx.location.capture("/sub")
       ngx.print(res.body)
       ngx.say("main post: ", ngx.ctx.blah)
   }
}

注意,这个方法查询的性能损耗还是比较昂贵的,所以,不要滥用这个api,只有在传递无法直接共享的变量上酌情使用。