Hello!
2015-04-20 2:20 GMT+08:00 ms2008:
> 对于 content_by_lua, 既然全局变量的生命期是基于每请求的, 那为什么像 local module = require 'modeule
> name'
> 这样的操作, 只会在第一次请求时加载一次? 难道不会被销毁吗?
>
require() 函数并没有使用全局变量,它是在 package.loaded 表里缓存已经加载的 Lua module 的。而
package.loaded 是挂载在 Lua VM 的 registry 表里的,不同于全局变量的环境表。
> 另外像 require 'module' 的方式其实都会在当前的环境生成 _G.module 全局变量. 那么在该请求结束时, 会不会销毁
> _G.module?
>
应避免使用 module() 函数的这种生成全局变量的副作用。这也是为什么现在 Lua 社区抵制使用 module() 函数来定义 Lua
模块,而推荐使用最原始的形式:
local _M = {}
_M.foo(...) ... end
_M.bar(...) ... end
return _M
> 还有我们可以利用 module 的方式来共享每 worker 的数据, 那么这些数据实际是保存在VM?
这也是利用了 package.loaded 是挂载到 registry 的特点。registry 是 Lua VM 级别共享的资源。
> 那么有没有一种方法是可以
> 打印当前VM的所有状态的?
>
可以使用下面这些 gdb 扩展命令来得到很多不同的 VM 状态数据,包括分享所有 Lua GC 对象(像 Lua 表、Lua 字符串、Lua 函数等等):
https://github.com/openresty/nginx-gdb-utils
使用 Lua/LuaJIT 自己的 debug 模块和 jit.* 模块也可以在 Lua 代码级别上拿到很多元信息。
仅供参考。
Regards,
-agentzh