Hello!
2013/4/22 duyue:
> 解决了。
>
> 把 require “bc" 写到init_by_lua或init_by_lua_file里,
> content_by_lua、content_by_lua_file里面直接使用bc
> 或者
> 在 content_by_lua、content_by_lua_file里local bc = require "bc"后再使用bc
>
> 这是什么原因啊?
>
你使用的这个 lbc 库不正确地使用了全局变量来存放其内部状态,换言之,它会污染使用者的全局作用域。对应到 lbc 的实现代码上,便是下面这两行:
luaL_newmetatable(L,MYTYPE);
lua_setglobal(L,MYNAME);
由于 ngx_lua 中,每个请求都有自己独立的全局环境,所以你在请求的 handler 中 require
这样的库,会导致后续请求无法正确使用这个库(因为后续请求都有自己干净的全局环境表,而这个 Lua
库依赖第一个请求的全局环境表来存取其内部状态数据)。
放在 init_by_lua 里之所以可以工作是因为 init_by_lua 使用的是 Lua VM
级别总的全局环境表,这个总的全局环境表会为所有请求的全局环境所继承。换言之,你的 lbc 库很可能“污染”了这个总的全局环境表 :)
作为设计良好的 Lua 库,无论如何都不应该去污染用户的全局环境表。建议你把这个问题报告给 lbc 的维护者。
Best regards,
-agentzh