返回首页 OpenResty 最佳实践

LuaRestyRedisLibrary

LuaCjsonLibrary

LuaNginxModule

LuaRestyDNSLibrary

LuaRestyLock

Lua

测试

Web 服务

火焰图

函数在调用代码前定义

Lua 里面的函数必须放在调用的代码之前,下面的代码是一个常见的错误:

local i = 100
i = add_one(i)

local function add_one(i)
    return i + 1
end

你会得到一个错误提示:

[error] 10514#0: *5 lua entry thread aborted: runtime error: attempt to call global 'add_one' (a nil value)

为什么放在调用后面就找不到呢?原因是 Lua 里的 function 定义本质上是变量赋值,即

function foo() ... end

等价于

foo = function () ... end

因此在函数定义之前使用函数相当于在变量赋值之前使用变量,自然会得到 nil 的错误。

一般地,由于全局变量是每请求的生命期,因此以此种方式定义的函数的生命期也是每请求的。为了避免每请求创建和销毁 Lua closure 的开销,建议将函数的定义都放置在自己的 Lua module 中,例如:

-- my_module.lua
module("my_module", package.seeall)
function foo() 
    -- your code 
end

然后,再在 content\_by\_lua\_file 指向的.lua 文件中调用它:

local my_module = require "my_module"
my_module.foo()

因为 Lua module 只会在第一次请求时加载一次(除非显式禁用了 lua\_code\_cache 配置指令),后续请求便可直接复用。

上一篇: 虚变量 下一篇: 抵制使用module()...