ngx lua:init_by_lua_block中的局部变量,init的范围

时间:2018-03-16 09:26:47

标签: nginx lua openresty lua-ngx-module

我是nginx lua的新手,并从以前的开发者那里得到了一个设置。试图通过文档来理解范围,但我很不确定。

现在就是这样

init_by_lua_block {
    my_module = require 'my_module'
    my_module.load_data()
}


location / {
    content_by_lua_block {
        my_module.use_data()
    }
}

在my_module

local _M = {}
local content = {}

function _M.use_data()
    -- access content variable
end

function _M.load_data()
    -- code to load json data into content variable
end

return _M

所以我的理解是,content是一个局部变量,因此它的生命周期在每个请求中。但是,它在init_by_lua_block中被初始化,并被其他本地函数使用,这让我感到困惑。这是一个好习惯吗?那个内容变量的实际生命周期是什么?

非常感谢阅读。

2 个答案:

答案 0 :(得分:1)

找到了这个:https://github.com/openresty/lua-nginx-module#data-sharing-within-an-nginx-worker

要在同一个nginx工作进程处理的所有请求之间全局共享数据,将共享数据封装到Lua模块中,使用Lua require builtin导入模块,然后在Lua中操作共享数据。这是有效的,因为所需的Lua模块只加载一次,并且所有协同程序将共享模块的相同副本(包括其代码和数据)。但请注意,由于每个请求的单协程隔离设计,Lua全局变量(注意,而不是模块级变量)不会在请求之间保持不变。

这是一个完整的小例子:

-- mydata.lua
local _M = {}

local data = {
    dog = 3,
    cat = 4,
    pig = 5,
}

function _M.get_age(name)
    return data[name]
end

return _M

然后从nginx.conf访问它:

location /lua {
    content_by_lua_block {
        local mydata = require "mydata"
        ngx.say(mydata.get_age("dog"))
    }
}

答案 1 :(得分:0)

在分叉工作进程之前,

init_by_lua[_block]在nginx-loading-config阶段运行。

所以content变量是全局的,每个请求都是一样的。

https://github.com/openresty/lua-nginx-module/#init_by_lua