OpenResty中请求返回后继续执行

2016-12-11  本文已影响0人  Uzero

接下来说的这个小技巧特别实用。在一些请求中,可能会做一些日志的推送、用户数据的统计、返回给终端数据等相关的操作。而这些操作,即使你用异步非阻塞的方式,在终端看来,也是会影响速度的。这个和我们的原则:终端请求,需要用最快的速度返回给终端,是冲突的。

这时候,最理想的是,获取完给终端返回的数据后,就断开连接,后面的日志和统计等动作,在断开连接后,后台继续完成即可。

怎么做到呢?就要用到这个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的高并发就是空谈。

上一篇下一篇

猜你喜欢

热点阅读