美文网首页
OpenResty中请求返回后继续执行

OpenResty中请求返回后继续执行

作者: Uzero | 来源:发表于2016-12-11 13:58 被阅读0次

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

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

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

    相关文章

      网友评论

          本文标题:OpenResty中请求返回后继续执行

          本文链接:https://www.haomeiwen.com/subject/drkpmttx.html