Hello!
2013/11/23 borlinmanbu:
>
> 我测试了下 用表 保存每个新来的websocket;
> t[1001] = wb1
> t[1002] = wb2
>
这种用法是错误的。
websocket 对象本质上也是 cosocket 对象。而根据目前 ngx_lua 模块的实现,cosocket
对象是不能在当前请求的范围之外使用的。所以通过 Lua 变量在不同的请求之间直接传递 cosocket
对象会导致未定义的行为,应当绝对避免。
你只能通过 Lua 变量在请求之间传递普通的 Lua 值。不过,即使你通过 Lua 变量来在请求之间传递值,你也只能在同一个 nginx
worker 进程服务的请求之间传递,毕竟不同的 nginx worker 进程都有自己独立的 Lua VM 实例和自己独立的进程空间。
一般建议使用共享内存字典来在请求之间共享和传递数据,毕竟共享内 存是当前的 nginx 服务器实例中的所有 nginx worker 进程共享的,见
https://github.com/chaoslawful/lua-nginx-module#lua_shared_dict
不过,值得提醒的是,如果你有多台前端机或者多个独立的 nginx 服务器实例,则共享内存字典也是不能跨域机器的边界或者 nginx
服务器实例(即 master-worker 进程组)的边界的。你需要借助于外部像 redis 这样的共享数据服务,或者自己做
sharding.
> 例如 服务端收到1001 客户端来消息 发送给 1002.。
> t[1002] :send_text("hello word !")
> 出现 错误;fatal error already happened,
这个错误一般是因为你之前的某一次操作没有进行恰当的错误处理,你的 Lua 代码继续尝试使用已经出现致命错误的 websocket 对象。
> 或者 soket busy 这样的错误!
>
这个错误是一般是当你有多个请求(或者多个轻量级线程)同时访问同一个 cosocket 对象时抛出的。你应当自己避免这种不正确的用法。
Regards,
-agentzh