ngx lua: область действия локальной переменной, init в init_by_lua_block
Я новичок в 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
и используется другими локальными функциями, что меня смущает. Это хорошая практика? И каково действительное время жизни этой переменной содержимого?
Большое спасибо за чтение.
2 ответа
Нашел это: https://github.com/openresty/lua-nginx-module
Чтобы глобально обмениваться данными между всеми запросами, обрабатываемыми одним и тем же рабочим процессом 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"))
}
}
init_by_lua[_block]
выполняется на этапе nginx-loading-config, прежде чем разветвляется рабочий процесс.
Итак content
переменная глобальная, она одинакова в каждом запросе.