不灭的焱

革命尚未成功,同志仍须努力

作者:php-note.com  发布于:2019-03-31 10:06  分类:OpenResty_Lua  编辑

当在 location 区块中使用 if 指令的时候会有一些问题, 在某些情况下它并不按照你的预期运行而是做一些完全不同的事情。而在另一些情况下他甚至会出现段错误。一般来说避免使用 if 指令是个好主意。

在 location 区块里 if 指令下唯一 100% 安全的指令应该只有:

return …; rewrite … last;

作者:php-note.com  发布于:2019-03-31 10:00  分类:OpenResty_Lua  编辑

语法规则

location [=|~|~*|^~]  /uri/  { … }

 

模式 含义
location = /uri = 表示精确匹配,只有完全匹配上才能生效
location ^~ /uri ^~ 开头对URL路径进行前缀匹配,并且在正则之前。
location ~ pattern 开头表示区分大小写的正则匹配
location ~* pattern 开头表示不区分大小写的正则匹配
location /uri 不带任何修饰符,也表示前缀匹配,但是在正则匹配之后
location / 通用匹配,任何未匹配到其它location的请求都会匹配到,相当于switch中的default
作者:php-note.com  发布于:2019-03-31 09:51  分类:OpenResty_Lua  编辑

为什么选择 Nginx?因为它具有以下特点:

1、处理响应请求很快
2、高并发连接
3、低的内存消耗

作者:php-note.com  发布于:2019-03-31 09:44  分类:OpenResty_Lua  编辑

Nginx ("engine x") 是一个高性能的 HTTP 和反向代理服务器,也是一个 IMAP/POP3/SMTP 代理服务器。Nginx 是由 Igor Sysoev 为俄罗斯著名的 Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。

作者:php-note.com  发布于:2019-03-31 09:39  分类:OpenResty_Lua  编辑

自从 OpenResty 1.5.8.1 版本之后,默认捆绑的 Lua 解释器就被替换成了 LuaJIT,而不再是标准 Lua。单从名字上,我们就可以直接看到这个新的解释器多了一个 JIT,接下来我们就一起来聊聊 JIT。

作者:php-note.com  发布于:2019-03-31 09:30  分类:OpenResty_Lua  编辑

FFI 库,是 LuaJIT 中最重要的一个扩展库。它允许从纯 Lua 代码调用外部 C 函数,使用 C 数据结构。有了它,就不用再像 Lua 标准 math 库一样,编写 Lua 扩展库。把开发者从开发 Lua 扩展 C 库(语言/功能绑定库)的繁重工作中释放出来。学习完本小节对开发纯 ffi 的库是有帮助的,像 lru-resty-lrucache 中的 pureffi.lua,这个纯 ffi 库非常高效地完成了 lru 缓存策略。

作者:php-note.com  发布于:2019-03-31 09:22  分类:OpenResty_Lua  编辑

对于比较底层的模块,内部使用到的非本地函数,都需要 local 本地化,这样做的好处:

  • 避免命名冲突:防止外部是 require(...) 的方法调用造成全局变量污染
  • 访问局部变量的速度比全局变量更快、更快、更快(重要事情说三遍)
作者:php-note.com  发布于:2019-03-31 09:19  分类:OpenResty_Lua  编辑

冒号操作会带入一个 self 参数,用来代表 自己。而点号操作,只是 内容 的展开。

作者:php-note.com  发布于:2019-03-31 09:09  分类:OpenResty_Lua  编辑

在函数定义之前使用函数相当于在变量赋值之前使用变量,Lua 世界对于没有赋值的变量,默认都是 nil,所以这里也就产生了一个 nil 的错误。

作者:php-note.com  发布于:2019-03-31 00:43  分类:OpenResty_Lua  编辑

旧式的模块定义方式是通过 module("filename"[,package.seeall])* 来显式声明一个包,现在官方不推荐再使用这种方式。这种方式将会返回一个由 filename 模块函数组成的 table,并且还会定义一个包含该 table 的全局变量。

作者:php-note.com  发布于:2019-03-31 00:41  分类:OpenResty_Lua  编辑

当一个方法返回多个值时,有些返回值有时候用不到,要是声明很多变量来一一接收,显然不太合适(不是不能)。Lua 提供了一个虚变量(dummy variable),以单个下划线(“_”)来命名,用它来丢弃不需要的数值,仅仅起到占位的作用。

作者:php-note.com  发布于:2019-03-31 00:35  分类:OpenResty_Lua  编辑

在 OpenResty 中,同时存在两套正则表达式规范:Lua 语言的规范和 ngx.re.* 的规范,即使您对 Lua 语言中的规范非常熟悉,我们仍不建议使用 Lua 中的正则表达式。一是因为 Lua 中正则表达式的性能并不如 ngx.re.* 中的正则表达式优秀;二是 Lua 中的正则表达式并不符合 POSIX 规范,而 ngx.re.* 中实现的是标准的 POSIX 规范,后者明显更具备通用性。

作者:php-note.com  发布于:2019-03-31 00:32  分类:OpenResty_Lua  编辑

大家在使用 Lua 的时候,一定会遇到不少和 nil 有关的坑吧。有时候不小心引用了一个没有赋值的变量,这时它的值默认为 nil。如果对一个 nil 进行索引的话,会导致异常。

作者:php-note.com  发布于:2019-03-31 00:29  分类:OpenResty_Lua  编辑

table.getn(t) 等价于 #t,但计算的是数组元素,不包括 hash 键值。而且数组是以第一个 nil 元素来判断数组结束。# 只计算 array 的元素个数,它实际上调用了对象的 metatable 的 __len 函数。对于有 __len 方法的函数返回函数返回值,不然就返回数组成员数目。

作者:php-note.com  发布于:2019-03-31 00:22  分类:OpenResty_Lua  编辑

Lua 的设计有一点很奇怪,在一个 block 中的变量,如果之前没有定义过,那么认为它是一个全局变量,而不是这个 block 的局部变量。这一点和别的语言不同。容易造成不小心覆盖了全局同名变量的错误。

作者:php-note.com  发布于:2019-03-31 00:13  分类:OpenResty_Lua  编辑

在 Lua 中,我们可以使用表和函数实现面向对象。将函数和相关的数据放置于同一个表中就形成了一个对象。

作者:php-note.com  发布于:2019-03-31 00:10  分类:OpenResty_Lua  编辑

在 Lua 5.1 语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,例如我们可以重载 "__add" 元方法 (metamethod),来计算两个 Lua 数组的并集;或者重载 "__index" 方法,来定义我们自己的 Hash 函数。Lua 提供了两个十分重要的用来处理元表的方法,如下:

  • setmetatable(table, metatable):此方法用于为一个表设置元表。
  • getmetatable(table):此方法用于获取表的元表对象。
作者:php-note.com  发布于:2019-03-31 00:03  分类:OpenResty_Lua  编辑

Lua I/O 库提供两种不同的方式处理文件:隐式文件描述,显式文件描述。

这些文件 I/O 操作,在 OpenResty 的上下文中对事件循环是会产生阻塞效应。OpenResty 比较擅长的是高并发网络处理,在这个环境中,任何文件的操作,都将阻塞其他并行执行的请求。实际中的应用,在 OpenResty 项目中应尽可能让网络处理部分、文件 I/0 操作部分相互独立,不要揉和在一起。

作者:php-note.com  发布于:2019-03-30 23:49  分类:OpenResty_Lua  编辑

Lua 数学库由一组标准的数学函数构成。数学库的引入丰富了 Lua 编程语言的功能,同时也方便了程序的编写。常用数学函数见下表:

作者:php-note.com  发布于:2019-03-30 23:30  分类:OpenResty_Lua  编辑

在 Lua 中,函数 time、date 和 difftime 提供了所有的日期和时间功能。

在 OpenResty 的世界里,不推荐使用这里的标准时间函数,因为这些函数通常会引发不止一个昂贵的系统调用,同时无法为 LuaJIT JIT 编译,对性能造成较大影响。推荐使用 ngx_lua 模块提供的带缓存的时间接口,如 ngx.today, ngx.time, ngx.utctime, ngx.localtime, ngx.now, ngx.http_time,以及 ngx.cookie_time 等。