ngx_lua_API 指令详解(一)ngx.timer.at 指令
語(yǔ)法: ok,err = ngx.timer.at(delay,callback,user_arg1,user_arg2 ...)
上下文: 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。*,balancer_by_lua *,ssl_certificate_by_lua *,ssl_session_fetch_by_lua *,ssl_session_store_by_lua *
描述:
創(chuàng)建一個(gè)帶有用戶回調(diào)函數(shù)的Nginx定時(shí)器以及可選的用戶參數(shù)。
第一個(gè)參數(shù)
delay指定定時(shí)器的延遲(以秒為單位)。可以指定小數(shù)秒0.001,這意味著1毫秒。0也可以指定延遲,在這種情況下,當(dāng)當(dāng)前處理程序產(chǎn)生執(zhí)行時(shí),定時(shí)器將立即過(guò)期。
第二個(gè)參數(shù)
callback可以是任何Lua函數(shù),后面將在后面的“l(fā)ight thread”中調(diào)用延遲指定。用戶回調(diào)將自動(dòng)Nginx的芯與參數(shù)調(diào)用premature, user_arg1,user_arg2,和等等,其中,所述premature 參數(shù)采用一個(gè)布爾值指示是否它是一個(gè)過(guò)早的計(jì)時(shí)器期滿或沒(méi)有,和user_arg1,user_arg2和等等,是那些(額外的)用戶調(diào)用ngx.timer.at 作為剩余參數(shù)時(shí)指定的參數(shù)。
當(dāng)Nginx工作進(jìn)程正在嘗試關(guān)閉時(shí),會(huì)發(fā)生提前定時(shí)器到期,如在Nginx配置中由HUP信號(hào)觸發(fā)的重新加載或Nginx服務(wù)器關(guān)閉。當(dāng)Nginx工作器試圖關(guān)閉時(shí),不能再調(diào)用ngx.timer.at創(chuàng)建具有非零延遲的新定時(shí)器,在這種情況下ngx.timer.at將返回nil,還有一個(gè)描述錯(cuò)誤的字符串,即“進(jìn)程退出”。
從v0.9.3發(fā)行版開始,即使Nginx工作進(jìn)程開始關(guān)閉,也允許創(chuàng)建零延遲定時(shí)器。
當(dāng)定時(shí)器到期時(shí),定時(shí)器回調(diào)中的用戶Lua代碼正在從創(chuàng)建定時(shí)器的原始請(qǐng)求完全分離的“輕線程”中運(yùn)行。因此,與創(chuàng)建它們的請(qǐng)求(如子倉(cāng))具有相同生命周期的對(duì)象不能在原始請(qǐng)求和定時(shí)器用戶回調(diào)函數(shù)之間共享。
?一、只執(zhí)行一次
nginx.conf
location /ngx_timer_at {default_type 'text/html';lua_code_cache off;content_by_lua_file /home/tinywan/Openresty_Protect/First_Protect/lua/get_timer_at.lua;}get_timer_at.lua 文件
local delay = 5 local handler handler = function (premature,param)-- do some routine job in Lua just like a cron jobif premature thenreturnendngx.log(ngx.ERR, "param is : ", param) endlocal ok, err = ngx.timer.at(delay, handler,"Hello Tinywan")執(zhí)行請(qǐng)求后:curl http://127.0.0.1/ngx_timer_at 執(zhí)行 5 s 后打印以下內(nèi)容在日志文件中
tail -f error.log 2017/05/04 23:24:38 [error] 95933#0: *433016 [lua] get_timer_at.lua:9: param is : Hello Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:80?
二、不停的循環(huán),和while 一樣的結(jié)果
local delay = 5 local handler handler = function (premature,param)-- do some routine job in Lua just like a cron jobif premature thenreturnendngx.log(ngx.ERR, "param is : ", param) ngx.timer.at(delay, handler,"again run... Tinywan") endlocal ok, err = ngx.timer.at(delay, handler,"Hello Tinywan")?
執(zhí)行請(qǐng)求后:curl http://127.0.0.1/ngx_timer_at 執(zhí)行 5 s 后打印以下內(nèi)容在日志文件中
2017/05/04 23:34:53 [error] 96020#0: *437080 [lua] get_timer_at.lua:9: param is : Hello Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:80 2017/05/04 23:34:58 [error] 96020#0: *437123 [lua] get_timer_at.lua:9: param is : again run... Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:80 2017/05/04 23:35:03 [error] 96020#0: *437152 [lua] get_timer_at.lua:9: param is : again run... Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:80 2017/05/04 23:35:08 [error] 96020#0: *437195 [lua] get_timer_at.lua:9: param is : again run... Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:80 2017/05/04 23:35:13 [error] 96020#0: *437224 [lua] get_timer_at.lua:9: param is : again run... Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:80?
?
<script?src="https://gist.github.com/Tinywan/8cff39afc1b512ca5bfa62a329e10506.js"></script> 通過(guò)?Lua?操作?Http?頭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*
Returns a Lua table holding all the current request headers.
local h = ngx.req.get_headers()for k, v in pairs(h) do ... endjson 和 lua table 轉(zhuǎn)換的細(xì)節(jié)
?
總結(jié)
以上是生活随笔為你收集整理的ngx_lua_API 指令详解(一)ngx.timer.at 指令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 杭州找Android工作的点点滴滴
- 下一篇: 《ES6标准入门》49~68Page 数