接下来说的这个小技巧特别实用。在一些请求中,可能会做一些日志的推送、用户数据的统计、返回给终端数据等相关的操作。而这些操作,即使你用异步非阻塞的方式,在终端看来,也是会影响速度的。这个和我们的原则:终端请求,需要用最快的速度返回给终端,是冲突的。
这时候,最理想的是,获取完给终端返回的数据后,就断开连接,后面的日志和统计等动作,在断开连接后,后台继续完成即可。
怎么做到呢?就要用到这个API了----》ngx.eof()
ngx.eof() 它可以即时关闭连接,把数据返回给终端,后面的操作【比如数据库】还会运行
来个简单的demo:
ngx.say(123)
ngx.eof()
ngx.say(456)
终端只看到浏览器输出123,为了证实代码还会继续运行,我们加上数据库的操作吧
ngx.say("1234 1234 唱首歌")
ngx.eof()
local mysql = require "mysql_redis.mysql_pool"
local sql = "insert into center_informInterface_data (str , out_trade_no , payment_type , time) values ('out_trade_no-18270821234567' , '18270821234567' , 'ybl' , '2016-12-11 13:52:50')"
local bool , res , sqlerr = mysql:query(sql)
if bool then
ngx.say("insert into ok")
else
ngx.say("insert into fail")
end
浏览器打印:1234 1234 唱首歌
mysql数据库增加行:34 out_trade_no-18270826055 18270826055 ybl 2016-12-11 13:52:50
说明:你不能任性的把阻塞的操作加入代码,即使在ngx.eof()之后。虽然已经返回了终端的请求,但是,nginx的worker还在被你占用。所以在keep alive的情况下,本次请求的总时间,会把上一次eof()之后的时间加上。如果你加入了阻塞的代码,nginx的高并发就是空谈。
网友评论