在使用nginx lua 时经常会使用ngx.var.varname 来获取变量,随着业务的越复杂,变量越来越多,发现服务的速度明显变慢了
本文分析了整个变量的获取和保存逻辑
- ngx_lua 获取变量
首先ngx_lua 获取变量调用的是 ngx_http_lua_var_get(lua_State *L)
46-static int
47ngx_http_lua_var_get(lua_State *L)
48{
49 ngx_http_request_t *r;
50 u_char *p, *lowcase;
51 size_t len;
52 ngx_uint_t hash;
53 ngx_str_t name;
54 ngx_http_variable_value_t *vv;
55
56#if (NGX_PCRE)
57 u_char *val;
58 ngx_uint_t n;
59 LUA_NUMBER index;
60 int *cap;
61#endif
62
63 r = ngx_http_lua_get_req(L);
64 if (r == NULL) {
65 return luaL_error(L, "no request object found");
66 }
...
111 p = (u_char *) lua_tolstring(L, -1, &len);
112
113 lowcase = lua_newuserdata(L, len);
114
115 hash = ngx_hash_strlow(lowcase, p, len);
116
117 name.len = len;
118 name.data = lowcase;
119 dd("variable name: %.*s", (int) len, lowcase);
120 vv = ngx_http_get_variable(r, &name, hash);
可见就是调用nginx的变量获取接口, 可以看到前面将变量名全部变为小写然后计算hash,ngx_lua是不区分大小写的
- nginx 变量的获取
546-ngx_http_variable_value_t *
547ngx_http_get_variable(ngx_http_request_t *r, ngx_str_t *name, ngx_uint_t key)
548{
549 ngx_http_variable_t *v;
550 ngx_http_variable_value_t *vv;