已经按照帮助解决,感谢非常详尽的解释!
在 2012年7月19日星期四UTC+8上午3时00分47秒,agentzh写道:
Hello!On Wed, Jul 18, 2012 at 4:33 AM, Zhaohao Liang <lia...@gmail.com> wrote:
> 使用openresty+luajit+ffi调用一个C库,请求多了后返回500,error_log显示:
>
>> 2012/07/18 18:39:58 [error] 20154#0: *33286 lua handler aborted: runtime
>> error: table overflow
>> stack traceback:
>> [C]: in function 'cdef'
>> .../libsrc/ngx_ffi.lua:13: in function <...libsrc/ngx_ffi.lua:1>,
>> client: 127.0.0.1, server: 127.0.0.1, request: .....
>
>
> ngx_ffi.lua的代码如下:
>
>> local ngx = require("ngx")
>> local ffi = require("ffi")
>>
>>
>>
>> ffi.cdef[[
>> typedef struct { void* ev_ptr; void* char_ptr; } bif_result;
>> bif_result* lib_search(const char* indexname, const char* key, const char*
>> start, const char* end, const char* datatype, const char* rowstart, const
>> char* pa
>> gesize);
>> void free_bif_result(bif_result* ptr);
>> ]]
>>
貌似你每请求都调用 ffi.cdef?建议把 ngx_ffi.lua 实现为一个真正的 Lua 模块,这样就可以享受只加载一次的好处,见:
http://wiki.nginx.org/HttpLuaModule#Data_Sharing_within_an_Nginx_Worker
你遇见的 table overflow 的错误很容易通过下面这个独立的 Lua 脚本复现:
-- test.lua
local ffi = require "ffi"
while true do
ffi.cdef[[
typedef struct { void* ev_ptr; void* char_ptr; } bif_result;
]]
end
命令行上的执行结果如下:
$ /usr/local/openresty/luajit/bin/luajit-2.0.0-beta10 test.lua
/usr/local/openresty/luajit/bin/luajit-2.0.0-beta10: table overflow
stack traceback:
[C]: in function 'cdef'
a.lua:6: in main chunk
[C]: ?
所以只要把 ffi.cdef 移出循环就不会溢出了。(而在你的场景中,则是把 ffi.cdef 调用移进 Lua 模块加载代码。)
可以参考一下我的 lua-resty-string 库中的 resty.md5 模块的实现:
https://github.com/agentzh/lua-resty-string/blob/master/lib/resty/md5.lua
Best regards,
-agentzh