我是 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
所以我的理解是,内容是一个局部变量,所以它的生命周期在每个请求中。但是,它正在
init_by_lua_block
中初始化,并且正在被其他本地函数使用,这让我感到困惑。这是一个好习惯吗?这个内容变量的实际生命周期是多少?非常感谢您的阅读。
最佳答案
找到这个:https://github.com/openresty/lua-nginx-module#data-sharing-within-an-nginx-worker
为了在同一个 nginx 工作进程处理的所有请求之间全局共享数据,将共享数据封装到 Lua 模块中,使用 Lua 内置的 require 导入模块,然后在 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"))
}
}
关于nginx - ngx lua : scope of local variable, init_by_lua_block 中的初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49317141/