语法: 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 *

描述:

  创建一个带有用户回调函数的Nginx定时器以及可选的用户参数。

第一个参数

  delay指定定时器的延迟(以秒为单位)。可以指定小数秒0.001,这意味着1毫秒。0也可以指定延迟,在这种情况下,当当前处理程序产生执行时,定时器将立即过期。

第二个参数

  callback可以是任何Lua函数,后面将在后面的“light thread”中调用延迟指定。用户回调将自动Nginx的芯与参数调用premature, user_arg1,user_arg2,和等等,其中,所述premature 参数采用一个布尔值指示是否它是一个过早的计时器期满或没有,和user_arg1,user_arg2和等等,是那些(额外的)用户调用ngx.timer.at 作为剩余参数时指定的参数。

  当Nginx工作进程正在尝试关闭时,会发生提前定时器到期,如在Nginx配置中由HUP信号触发的重新加载或Nginx服务器关闭。当Nginx工作器试图关闭时,不能再调用ngx.timer.at创建具有非零延迟的新定时器,在这种情况下ngx.timer.at将返回nil,还有一个描述错误的字符串,即“进程退出”。

  从v0.9.3发行版开始,即使Nginx工作进程开始关闭,也允许创建零延迟定时器。

  当定时器到期时,定时器回调中的用户Lua代码正在从创建定时器的原始请求完全分离的“轻线程”中运行。因此,与创建它们的请求(如子仓)具有相同生命周期的对象不能在原始请求和定时器用户回调函数之间共享。

一、只执行一次

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 =
local handler
handler = function (premature,param)
-- do some routine job in Lua just like a cron job
if premature then
return
end ngx.log(ngx.ERR, "param is : ", param)
end local ok, err = ngx.timer.at(delay, handler,"Hello Tinywan")

执行请求后:curl http://127.0.0.1/ngx_timer_at 执行 5 s 后打印以下内容在日志文件中

    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

二、不停的循环,和while 一样的结果

local delay =
local handler
handler = function (premature,param)
-- do some routine job in Lua just like a cron job
if premature then
return
end ngx.log(ngx.ERR, "param is : ", param) ngx.timer.at(delay, handler,"again run... Tinywan")
end local ok, err = ngx.timer.at(delay, handler,"Hello Tinywan")

执行请求后:curl http://127.0.0.1/ngx_timer_at 执行 5 s 后打印以下内容在日志文件中

// :: [error] #: * [lua] get_timer_at.lua:: param is : Hello Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:
// :: [error] #: * [lua] get_timer_at.lua:: param is : again run... Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:
// :: [error] #: * [lua] get_timer_at.lua:: param is : again run... Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:
// :: [error] #: * [lua] get_timer_at.lua:: param is : again run... Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:
// :: [error] #: * [lua] get_timer_at.lua:: param is : again run... Tinywan, context: ngx.timer, client: 127.0.0.1, server: 0.0.0.0:
<script src="https://gist.github.com/Tinywan/8cff39afc1b512ca5bfa62a329e10506.js"></script>
 
通过 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
...
end

json 和 lua table 转换的细节

ngx_lua_API 指令详解(一)ngx.timer.at 指令的更多相关文章

  1. #pragma 预处理指令详解

    源地址:http://blog.csdn.net/jx_kingwei/article/details/367312 #pragma  预处理指令详解              在所有的预处理指令中, ...

  2. [转]JVM指令详解(上)

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 本文主要记录一些JVM指令,便于记忆与查阅. 一.未归类系列A 此系列暂未归类. 指令码    助记符      ...

  3. C#中的预处理器指令详解

    这篇文章主要介绍了C#中的预处理器指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregio ...

  4. rsync指令详解

    rsync指令详解(更详细的看官方文档http://rsync.samba.org/ftp/rsync/rsync.html) [root@Centos epel]# rsync --help rsy ...

  5. 迈向angularjs2系列(2):angular2指令详解

    一:angular2 helloworld! 为了简单快速的运行一个ng2的app,那么通过script引入预先编译好的angular2版本和页面的基本框架. index.html: <!DOC ...

  6. LDM与STM指令详解

    title: LDM与STM指令详解 date: 2019/2/26 17:58:00 toc: true --- LDM与STM指令详解 指令形式如下,这里的存储方向是针对寄存器的 Load Mul ...

  7. C#中的预处理指令详解

    这篇文章主要介绍了C#中的预处理指令详解,本文讲解了#define 和 #undef.#if.#elif.#else和#endif.#warning和#error.#region和#endregion ...

  8. pragma comment的使用 pragma预处理指令详解

    pragma comment的使用 pragma预处理指令详解   #pragma comment( comment-type [,"commentstring"] ) 该宏放置一 ...

  9. Docker技术入门与实战 第二版-学习笔记-3-Dockerfile 指令详解

    前面已经讲解了FROM.RUN指令,还提及了COPY.ADD,接下来学习其他的指令 5.Dockerfile 指令详解 1> COPY 复制文件 格式: COPY  <源路径> .. ...

  10. nginx.conf中关于nginx-rtmp-module配置指令详解

    译序:截至 Jul 8th,2013 官方公布的最新 Nginx RTMP 模块 nginx-rtmp-module 指令详解.指令Corertmp语法:rtmp { ... }上下文:根描述:保存所 ...

随机推荐

  1. APP案例分析——Steam

    本次作业的分析对象是Steam,一款全球最大最广泛的游戏平台.之所以选择Steam是因为我已经在这上面挥洒了大量的青春,对它也有了很深的感情. 调研.评测 个人第一次上手体验 打开首页就可以看到琳琅满 ...

  2. python基础(三)python数据类型

    一.数据类型 计算机顾名思义就是可以做数学计算的机器,因此,计算机程序理所当然地可以处理各种数值.但是,计算机能处理的远不止数值,还可以处理文本.图形.音频.视频.网页等各种各样的数据,不同的数据,需 ...

  3. express入门学习(一)

    一.安装express cnpm || npm  install express --save ; 1. Hello  World var express = require('express'); ...

  4. [转帖] SQLNET.ORA的处理.

    被一个客户端连接远程数据库阻塞超时的问题困扰了好久,最后终于找到了答案  https://blog.csdn.net/herobox/article/details/16985097   Oracle ...

  5. 为什么选择 .NET Core?

     为什么选择.NETCore? 学习新的开发框架是一项巨大的投资.您需要学习如何在新框架中编写,构建,测试,部署和维护应用程序.作为开发人员,有许多框架可供选择,很难知道什么是最适合的.即使您正在使用 ...

  6. 如何调换antd中Modal对话框确认按钮和取消按钮两个按钮的位置

    今天有个工作是把所有的确认按钮放在取消按钮的左边,类似于下图这样的,公司用的时antd组件 但是antd组件的按钮时确认键放在右边的 可以采用下面的方式,将按钮调换过来: 对的,就是在modal里面的 ...

  7. MySQL的间隙锁

    什么是间隙锁当我们用范围条件而不是相等条件检索数据,并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁:对于键值在条件范围内但不存在的记录,叫做“间隙(GAP)”,InnoDB也 ...

  8. Python 变量(下)

    列表 列表是可修改的序列类型.所以列表不可以作为字典的键. >>> a = [1] >>> hash(a) Traceback (most recent call ...

  9. BZOJ5118 Fib数列2(矩阵快速幂)

    特殊矩阵的幂同样满足费马小定理. #include<iostream> #include<cstdio> #include<cmath> #include<c ...

  10. R2学习记录

    Setting up the Libevent library1.重写log行为 #include <event2/event.h> #include <stdio.h> st ...