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

Lua*_*yen 4 lua nginx 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()
    }
}
Run Code Online (Sandbox Code Playgroud)

在 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
Run Code Online (Sandbox Code Playgroud)

所以我的理解是,内容是一个局部变量,因此它的生命周期在每个请求内。然而,它正在被初始化init_by_lua_block,并且被其他本地函数使用,这让我感到困惑。这是一个好的做法吗?这个内容变量的实际生命周期是多少?

非常感谢您的阅读。

Lua*_*yen 5

发现这个: 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
Run Code Online (Sandbox Code Playgroud)

然后从 nginx.conf 访问它:

location /lua {
    content_by_lua_block {
        local mydata = require "mydata"
        ngx.say(mydata.get_age("dog"))
    }
}
Run Code Online (Sandbox Code Playgroud)