Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Nginx ngx lua:局部变量的作用域,init在init_by_lua_块中_Nginx_Lua_Openresty_Lua Ngx Module - Fatal编程技术网

Nginx ngx lua:局部变量的作用域,init在init_by_lua_块中

Nginx ngx lua:局部变量的作用域,init在init_by_lua_块中,nginx,lua,openresty,lua-ngx-module,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() } } 在我的单元里 local _M = {} local c

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

现在是这样的

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


location / {
    content_by_lua_block {
        my_module.use_data()
    }
}
在我的单元里

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\u中被\u lua\u块初始化,并被其他本地函数使用,这让我感到困惑。这是一种好的做法吗?这个内容变量的实际生存期是多少


非常感谢阅读。

init\u by\u lua[\u block]
在nginx加载配置阶段运行,然后再分叉工作进程

所以
content
变量是全局变量,在每个请求中都是相同的

找到了以下内容:

要在同一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"))
    }
}

谢谢你的回答。然而,它似乎不是全局变量。刚找到这个直接回答我问题的甜点!我应该把mydata.lua放在哪里nginx应该怎么做才能看到mydata.lua模块?