Home >Backend Development >PHP Tutorial >nginx lua api translation
syntax:val = ngx.arg[index]
context: set_by_lua*, body_filter_by_lua*
By using valua = ngx.arg[n] , let nginx variables be passed into lua as parameters to call lua. The usage method is as follows: the value of<span>location</span> /foo <span>{</span><span>set</span><span>$a</span><span>32</span><span>;</span><span>set</span><span>$b</span><span>56</span><span>;</span> set_by_lua <span>$sum</span><span>'return tonumber(ngx.arg[1]) + tonumber(ngx.arg[2])'</span><span>$a</span><span>$b</span><span>;</span> echo <span>$sum</span><span>;</span><span>}</span>$sum is 88 in the end.
syntax:ngx.var.VAR_NAME
context: set_by_lua*, rewrite_by_lua*, access _by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua* , log_by_lua*You can read and write nginx variables through the following code
value = ngx.var.some_nginx_variable_name<span>location</span> /foo <span>{</span><span>set</span><span>$my_var</span><span>''</span><span>;</span><span><em># this line is required to create $my_var at config time</em></span> content_by_lua <span>' ngx.var.my_var = 123; ... '</span><span>;</span><span>}</span>You can get or set the nginx.conf variable in the lua code, compare What is the difference between the nginx.arg below and the one above~
ngx.OK <span>(</span><span>0</span><span>)</span> ngx.ERROR <span>(</span>-<span>1</span><span>)</span> ngx.AGAIN <span>(</span>-<span>2</span><span>)</span> ngx.DONE <span>(</span>-<span>4</span><span>)</span> ngx.DECLINED <span>(</span>-<span>5</span><span>)</span>
ngx.HTTP_GET ngx.HTTP_HEAD ngx.HTTP_PUT ngx.HTTP_POST ngx.HTTP_DELETE ngx.HTTP_OPTIONS (added in the v0.5.0rc24 release) ngx.HTTP_MKCOL (added in the v0.8.2 release) ngx.HTTP_COPY (added in the v0.8.2 release) ngx.HTTP_MOVE (added in the v0.8.2 release) ngx.HTTP_PROPFIND (added in the v0.8.2 release) ngx.HTTP_PROPPATCH (added in the v0.8.2 release) ngx.HTTP_LOCK (added in the v0.8.2 release) ngx.HTTP_UNLOCK (added in the v0.8.2 release) ngx.HTTP_PATCH (added in the v0.8.2 release) ngx.HTTP_TRACE (added in the v0.8.2 release)Some http method constants, generally used in ngx.location.capture and ngx.location.capture_multi API calls~
value <span>=</span> ngx.HTTP_OK <span>(</span><span>200</span><span>)</span> value <span>=</span> ngx.HTTP_CREATED <span>(</span><span>201</span><span>)</span> value <span>=</span> ngx.HTTP_SPECIAL_RESPONSE <span>(</span><span>300</span><span>)</span> value <span>=</span> ngx.HTTP_MOVED_PERMANENTLY <span>(</span><span>301</span><span>)</span> value <span>=</span> ngx.HTTP_MOVED_TEMPORARILY <span>(</span><span>302</span><span>)</span> value <span>=</span> ngx.HTTP_SEE_OTHER <span>(</span><span>303</span><span>)</span> value <span>=</span> ngx.HTTP_NOT_MODIFIED <span>(</span><span>304</span><span>)</span> value <span>=</span> ngx.HTTP_BAD_REQUEST <span>(</span><span>400</span><span>)</span> value <span>=</span> ngx.HTTP_UNAUTHORIZED <span>(</span><span>401</span><span>)</span> value <span>=</span> ngx.HTTP_FORBIDDEN <span>(</span><span>403</span><span>)</span> value <span>=</span> ngx.HTTP_NOT_FOUND <span>(</span><span>404</span><span>)</span> value <span>=</span> ngx.HTTP_NOT_ALLOWED <span>(</span><span>405</span><span>)</span> value <span>=</span> ngx.HTTP_GONE <span>(</span><span>410</span><span>)</span> value <span>=</span> ngx.HTTP_INTERNAL_SERVER_ERROR <span>(</span><span>500</span><span>)</span> value <span>=</span> ngx.HTTP_METHOD_NOT_IMPLEMENTED <span>(</span><span>501</span><span>)</span> value <span>=</span> ngx.HTTP_SERVICE_UNAVAILABLE <span>(</span><span>503</span><span>)</span> value <span>=</span> ngx.HTTP_GATEWAY_TIMEOUT <span>(</span><span>504</span><span>)</span><span>(</span>first added in the v0.3.1rc38 release<span>)</span>http response status constants
ngx.STDERR ngx.EMERG ngx.ALERT ngx.CRIT ngx.ERR ngx.WARN ngx.NOTICE ngx.INFO ngx.DEBUGnginx log, generally used in the ngx.log API
syntax: print(...)
context:init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua, log_by_lua*, ngx.timer.*This API uses the log level of ngx.NOTICE to write the parameter value into the error.log file, which is equivalent to ngx.log(ngx.NOTICE,...)
<span>location</span> /test <span>{</span> rewrite_by_lua <span>' ngx.say("foo = ", ngx.ctx.foo) ngx.ctx.foo = 76 '</span><span>;</span> access_by_lua <span>' ngx.ctx.foo = ngx.ctx.foo + 3 '</span><span>;</span> content_by_lua <span>' ngx.say(ngx.ctx.foo) '</span><span>;</span><span>}</span>, the output result is
foo = nil <span>79</span>This instance of ngx.ctx.foo is used in rewrite, access and There are three cycles of content.
<span>location</span> /sub <span>{</span> content_by_lua <span>' ngx.say("sub pre: ", ngx.ctx.blah) ngx.ctx.blah = 32 ngx.say("sub post: ", ngx.ctx.blah) '</span><span>;</span><span>}</span> <span>location</span> /main <span>{</span> content_by_lua <span>' ngx.ctx.blah = 73 ngx.say("main pre: ", ngx.ctx.blah) local res = ngx.location.capture("/sub") ngx.print(res.body) ngx.say("main post: ", ngx.ctx.blah) '</span><span>;</span><span>}</span>The result is
main pre: <span>73</span> sub pre: nil sub post: <span>32</span> main post: <span>73</span>ngx.location.capture is requesting another link, so you can see that ngx.ctx in sub and main are different instances.
syntax: res = ngx.location.capture(uri, options?)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*通过这个api,lua可以访问本server的其他location,只能是同一个server的。用法如下
res <span>=</span> ngx.location.capture<span>(</span>uri<span>)</span>返回的是一个response对象,这个对象持有其他包括res.status、res.body以及res.header三个对象。
ngx.location.capture<span>(</span><span>'/foo?a=1'</span>, <span>{</span> args <span>=</span><span>{</span> b <span>=</span><span>3</span>, c <span>=</span><span>':'</span><span>}</span><span>}</span><span>)</span>等价于下面的调用,都是传递请求参数
ngx.location.capture<span>(</span><span>'/foo?a=1&b=3&c=%3a'</span><span>)</span>-ctx 之前在ngx.ctx说的,在一个请求中独享一个ngx.ctx。但是在这里通过ctx,可以传入一个字典,然后通过子请求设置ngx.ctx的值,从而,我们在父请求中得到子请求ngx.ctx的值。
<span>location</span> /sub <span>{</span> content_by_lua <span>' ngx.ctx.foo = "bar"; '</span><span>;</span><span>}</span><span>location</span> /lua <span>{</span> content_by_lua <span>' local ctx = {} res = ngx.location.capture("/sub", { ctx = ctx }) ngx.say(ctx.foo); ngx.say(ngx.ctx.foo); '</span><span>;</span><span>}</span>
结果如下,仅仅是设置ctx这个字典的值,而不是共享ngx.ctx
bar nil-vars 这个参数用来在父请求中设置nginx的变量值并向子请求传递,这个方法比通过url参数传递更加有效果。
<span>location</span> /other <span>{</span> content_by_lua <span>' ngx.say("dog = ", ngx.var.dog) ngx.say("cat = ", ngx.var.cat) '</span><span>;</span><span>}</span> <span>location</span> /lua <span>{</span><span>set</span><span>$dog</span><span>''</span><span>;</span><span>set</span><span>$cat</span><span>''</span><span>;</span> content_by_lua <span>' res = ngx.location.capture("/other", { vars = { dog = "hello", cat = 32 }}); ngx.print(res.body) '</span><span>;</span><span>}</span>结果如下
dog = hello cat = 32-copy_all_vars 拷贝父请求的nginx的变量给子请求
<span>location</span> /other <span>{</span><span>set</span><span>$dog</span><span>"$dog world"</span><span>;</span> echo <span>"$uri dog: $dog"</span><span>;</span><span>}</span> <span>location</span> /lua <span>{</span><span>set</span><span>$dog</span><span>'hello'</span><span>;</span> content_by_lua <span>' res = ngx.location.capture("/other", { copy_all_vars = true }); ngx.print(res.body) ngx.say(ngx.var.uri, ": ", ngx.var.dog) '</span><span>;</span><span>}</span>结果如下
/other dog: hello world /lua: hello-share_all_vars 同享父请求和子请求的nginx的变量。
<span>location</span> /other <span>{</span><span>set</span><span>$dog</span><span>"$dog world"</span><span>;</span> echo <span>"$uri dog: $dog"</span><span>;</span><span>}</span> <span>location</span> /lua <span>{</span><span>set</span><span>$dog</span><span>'hello'</span><span>;</span> content_by_lua <span>' res = ngx.location.capture("/other", { share_all_vars = true }); ngx.print(res.body) ngx.say(ngx.var.uri, ": ", ngx.var.dog) '</span><span>;</span><span>}</span>结果如下
/other dog: hello world /lua: hello world这个比copy_all_vars优先。
syntax: res1, res2, ... = ngx.location.capture_multi({ {uri, options?}, {uri, options?}, ... })
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
类似于上面的ngx.location.capture ,不过支持并行请求多个子请求res1, res2, res3 <span>=</span> ngx.location.capture_multi<span>{</span><span>{</span><span>"/foo"</span>, <span>{</span> args <span>=</span><span>"a=3&b=4"</span><span>}</span><span>}</span>, <span>{</span><span>"/bar"</span><span>}</span>, <span>{</span><span>"/baz"</span>, <span>{</span> method <span>=</span> ngx.HTTP_POST, body <span>=</span><span>"hello"</span><span>}</span><span>}</span>, <span>}</span> <span>if</span> res1.status <span>==</span> ngx.HTTP_OK <span>then</span> ... <span>end</span> <span>if</span> res2.body <span>==</span><span>"BLAH"</span><span>then</span> ... <span>end</span>
<span><em>-- construct the requests table</em></span><span>local</span> reqs <span>=</span><span>{</span><span>}</span><span>table.insert</span><span>(</span>reqs, <span>{</span><span>"/mysql"</span><span>}</span><span>)</span><span>table.insert</span><span>(</span>reqs, <span>{</span><span>"/postgres"</span><span>}</span><span>)</span><span>table.insert</span><span>(</span>reqs, <span>{</span><span>"/redis"</span><span>}</span><span>)</span><span>table.insert</span><span>(</span>reqs, <span>{</span><span>"/memcached"</span><span>}</span><span>)</span> <span><em>-- issue all the requests at once and wait until they all return</em></span><span>local</span> resps <span>=</span><span>{</span> ngx.location.capture_multi<span>(</span>reqs<span>)</span><span>}</span> <span><em>-- loop over the responses table</em></span><span>for</span> i, resp <span>in</span><span>ipairs</span><span>(</span>resps<span>)</span><span>do</span><span><em>-- process the response table "resp"</em></span><span>end</span>
ngx.status <span>=</span> ngx.HTTP_CREATED status <span>=</span> ngx.status
syntax: ngx.header.HEADER = VALUE
syntax: value = ngx.header.HEADER
context: rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua, log_by_lua*
获取或者设置http header的值<span><em>-- equivalent to ngx.header["Content-Type"] = 'text/plain'</em></span> ngx.header.content_type <span>=</span><span>'text/plain'</span><span>;</span> ngx.header<span>[</span><span>"X-My-Header"</span><span>]</span><span>=</span><span>'blah blah'</span><span>;</span>多个值的可以像下面那样设置
ngx.header<span>[</span><span>'Set-Cookie'</span><span>]</span><span>=</span><span>{</span><span>'a=32; path=/'</span>, <span>'b=4; path=/'</span><span>}</span>
Set-Cookie: <span>a</span>=<span>32</span>; <span>path</span>=<span>/</span> Set-Cookie: <span>b</span>=<span>4</span>; <span>path</span>=<span>/</span>特别是在header_filter_by_lua有效果,如
<span>location</span> /test <span>{</span><span>set</span><span>$footer</span><span>''</span><span>;</span> <span>proxy_pass</span><span>http</span>://some-backend<span>;</span> header_filter_by_lua <span>' if ngx.header["X-My-Header"] == "blah" then ngx.var.footer = "some value" end '</span><span>;</span> echo_after_body <span>$footer</span><span>;</span><span>}</span>
syntax: headers = ngx.resp.get_headers(max_headers?, raw?)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua, log_by_lua*
<span>local</span> h <span>=</span> ngx.resp.get_headers<span>(</span><span>)</span><span>for</span> k, v <span>in</span><span>pairs</span><span>(</span>h<span>)</span><span>do</span> ... <span>end</span>在lua中得到http请求的响应头,以字典的形式
syntax: secs = ngx.req.start_time()
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*
<span>local</span> request_time <span>=</span> ngx.now<span>(</span><span>)</span> - ngx.req.start_time<span>(</span><span>)</span>用来获取此次请求发起的时候的时间,用来模拟$request_time。
syntax: num = ngx.req.http_version()
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*
获取请求的http versionsyntax: str = ngx.req.raw_header(no_request_line?)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*
得到原http header的字符串文本内容ngx.<span>print</span><span>(</span>ngx.req.raw_header<span>(</span><span>)</span><span>)</span>结果是
GET /t HTTP/1.1 Host: localhost Connection: close Foo: bar
syntax: method_name = ngx.req.get_method()
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*
获得当前请求的method 名字syntax: ngx.req.set_method(method_id)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*
设置覆盖此次请求的method名字syntax: ngx.req.set_uri(uri, jump?)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*
作用与rewrite相同,其中jump默认为false,false的时候ngx.req.set_uri<span>(</span><span>"/foo"</span>, <span>false</span><span>)</span>结果是
<span>rewrite</span> ^ /foo <span>break</span><span>;</span>如果jump为true,那就是
ngx.req.set_uri<span>(</span><span>"/foo"</span>, <span>true</span><span>)</span>结果是
<span>rewrite</span> ^ /foo last<span>;</span>
syntax: ngx.req.set_uri_args(args)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*
rewrite当前的请求参数ngx.req.set_uri_args<span>(</span><span>"a=3&b=hello%20world"</span><span>)</span>或者
ngx.req.set_uri_args<span>(</span><span>{</span> a <span>=</span><span>3</span>, b <span>=</span><span>"hello world"</span><span>}</span><span>)</span>
syntax: args = ngx.req.get_uri_args(max_args?)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua, log_by_lua*
获得请求的参数<span>location</span><span>=</span> /test <span>{</span> content_by_lua <span>' local args = ngx.req.get_uri_args() for key, val in pairs(args) do if type(val) == "table" then ngx.say(key, ": ", table.concat(val, ", ")) else ngx.say(key, ": ", val) end end '</span><span>;</span><span>}</span>当访问的是
foo: bar bar: baz, blah
syntax: args, err = ngx.req.get_post_args(max_args?)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua, log_by_lua*
得到post提交的参数<span>location</span><span>=</span> /test <span>{</span> content_by_lua <span>' ngx.req.read_body() local args, err = ngx.req.get_post_args() if not args then ngx.say("failed to get post args: ", err) return end for key, val in pairs(args) do if type(val) == "table" then ngx.say(key, ": ", table.concat(val, ", ")) else ngx.say(key, ": ", val) end end '</span><span>;</span><span>}</span>当我们用curl提交参数时
<span><em># Post request with the body 'foo=bar&bar=baz&bar=blah'</em></span> $ curl <span>--data</span><span>'foo=bar&bar=baz&bar=blah'</span> localhost<span>/</span><span>test</span>结果是
foo: bar bar: baz, blah
syntax: headers = ngx.req.get_headers(max_headers?, raw?)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua, log_by_lua*
获取当前请求的头信息<span>local</span> h <span>=</span> ngx.req.get_headers<span>(</span><span>)</span><span>for</span> k, v <span>in</span><span>pairs</span><span>(</span>h<span>)</span><span>do</span> ... <span>end</span>
ngx.say<span>(</span><span>"Host: "</span>, ngx.req.get_headers<span>(</span><span>)</span><span>[</span><span>"Host"</span><span>]</span><span>)</span>
syntax: ngx.req.set_header(header_name, header_value)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua
设置当前的请求头ngx.req.set_header<span>(</span><span>"Content-Type"</span>, <span>"text/css"</span><span>)</span>
ngx.req.set_header<span>(</span><span>"Foo"</span>, <span>{</span><span>"a"</span>, <span>"abc"</span><span>}</span><span>)</span>
syntax: ngx.req.clear_header(header_name)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*
清除某一个请求头syntax: ngx.req.read_body()
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
在不阻塞nginx事件轮询的情况下读取客户端请求的bodyngx.req.read_body<span>(</span><span>)</span><span>local</span> args <span>=</span> ngx.req.get_post_args<span>(</span><span>)</span>
syntax: ngx.req.discard_body()
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
明确丢弃客户端请求bodysyntax: data = ngx.req.get_body_data()
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
以字符串的形式获得客户端的请求body内容syntax: file_name = ngx.req.get_body_file()
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
当发送文件请求的时候,获得文件的名字syntax: ngx.req.set_body_data(data)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
设置客户端请求的bodysyntax: ngx.req.set_body_data(data)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
通过filename来指定当前请求的file data。syntax: ngx.req.init_body(buffer_size?)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*
创建一个当前请求的空白body的buffer,后续可以自己写入请求的body。ngx.req.init_body<span>(</span><span>128</span><span>*</span><span>1024</span><span>)</span><span><em>-- buffer is 128KB</em></span><span>for</span> chunk <span>in</span> next_data_chunk<span>(</span><span>)</span><span> do</span> ngx.req.append_body<span>(</span>chunk<span>)</span><span><em>-- each chunk can be 4KB</em></span><span>end</span> ngx.req.finish_body<span>(</span><span>)</span>
syntax: ngx.req.append_body(data_chunk)
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*
追加当前请求的http bodysyntax: ngx.req.finish_body()
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*
标志完成ngx.req.init_body的数据追加。syntax: tcpsock, err = ngx.req.socket()
syntax: tcpsock, err = ngx.req.socket(raw)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
这个方法会返回一个只读的cosocket对象,用来读取当前请求的request http body内容。syntax: ngx.exec(uri, args?)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
执行内部跳转根据url和请求参数ngx.exec<span>(</span><span>'/some-location'</span><span>)</span><span>;</span> ngx.exec<span>(</span><span>'/some-location'</span>, <span>'a=3&b=5&c=6'</span><span>)</span><span>;</span> ngx.exec<span>(</span><span>'/some-location?a=3&b=5'</span>, <span>'c=6'</span><span>)</span><span>;</span>
<span>location</span> /foo <span>{</span> content_by_lua <span>' ngx.exec("@bar", "a=goodbye"); '</span><span>;</span><span>}</span> <span>location</span><span>@bar</span><span>{</span> content_by_lua <span>' local args = ngx.req.get_uri_args() for key, val in pairs(args) do if key == "a" then ngx.say(val) end end '</span><span>;</span><span>}</span>
syntax: ngx.redirect(uri, status?)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
执行301或者302的重定向。syntax: ok, err = ngx.send_headers()
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
指定响应头。syntax: value = ngx.headers_sent
context: set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*
判断头部是否发送给客户端了。syntax: ok, err = ngx.print(...)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
发送数据给客户端响应页面<span>local</span><span>table</span><span>=</span><span>{</span><span>"hello, "</span>, <span>{</span><span>"world: "</span>, <span>true</span>, <span>" or "</span>, <span>false</span>, <span>{</span><span>": "</span>, <span>nil</span><span>}</span><span>}</span><span>}</span> ngx.<span>print</span><span>(</span><span>table</span><span>)</span>
syntax: ok, err = ngx.say(...)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
作用类似于ngx.printsyntax: ngx.log(log_level, ...)
context: init_by_lua*, init_worker_by_lua*, set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*, ngx.timer.*
向error.log中记录日志syntax: ok, err = ngx.flush(wait?)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
将flush内容到客户端页面syntax: ngx.exit(status)
context: rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, ngx.timer.*
ngx.status <span>=</span> ngx.HTTP_GONE ngx.say<span>(</span><span>"This is our own content"</span><span>)</span><span><em>-- to cause quit the whole request rather than the current phase handler</em></span> ngx.<span>exit</span><span>(</span>ngx.HTTP_OK<span>)</span>当status>=200的时候,直接停止当前请求的后续操作,并且返回状态码
syntax: ok, err = ngx.eof()
context: rewrite_by_lua*, access_by_lua*, content_by_lua*
<span>location</span><span>=</span> /async <span>{</span><span>keepalive_timeout</span><span>0</span><span>;</span> content_by_lua <span>' ngx.say("got the task!") ngx.eof() -- a descent HTTP client will close the connection at this point -- access MySQL, PostgreSQL, Redis, Memcached, and etc here... '</span><span>;</span><span>}</span>明确指定关闭结束输出流。
以上就介绍了nginx lua api翻译,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。