在 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 等。
将 空字符串 转为 数组时,有 业务bug,如
$str = ""; $arr = explode(",", $str); print_r($arr);
输出:
Array ( [0] => )
Golang的主要 设计目标之一就是面向大规模后端服务程序,网络通信这块是服务端 程序必不可少也是至关重要的一部分。在日常应用中,我们也可以看到Go中的net以及其subdirectories下的包均是“高频+刚需”,而TCP socket则是网络编程的主流,即便您没有直接使用到net中有关TCP Socket方面的接口,但net/http总是用到了吧,http底层依旧是用tcp socket实现的。
unpack()函数
可以使用table.unpack()
函数,将数组形式的table拆开。
这个函数有三个参数,第一个参数就是要拆的table,第二个参数是起始元素的下标,默认为1,第三个参数是结束元素的下标,默认为table的长度。
例如:
local tbl = { 2, 4, 6, 8 } local a, b, c, d = unpack(tbl)
在 Lua 5.1 语言中,元表 (metatable) 的表现行为类似于 C++ 语言中的操作符重载,例如我们可以重载 "__add" 元方法 (metamethod),来计算两个 Lua 数组的并集;或者重载 "__index" 方法,来定义我们自己的 Hash 函数。Lua 提供了两个十分重要的用来处理元表的方法,如下:
- setmetatable(table, metatable):此方法用于为一个表设置元表。
- getmetatable(table):此方法用于获取表的元表对象。
旧式的模块定义方式是通过 module("filename"[,package.seeall])* 来显式声明一个包,现在官方不推荐再使用这种方式。这种方式将会返回一个由 filename 模块函数组成的 table,并且还会定义一个包含该 table 的全局变量。
cp 貌似没有排除目录的功能,可以使用 rsync 命令来实现了,如:
【案例】
/home/52php目录里面有data目录,data目录里面有 a、b、c、d、e 五个目录,现在要把data目录里面除过 a、b、c 目录之外的所有目录拷贝到/bak目录中。
在 OpenResty 的体系中,可以通过共享内存的方式完成不同工作进程的数据共享,可以通过 Lua 模块方式完成单个进程内不同请求的数据共享。如何完成单个请求内不同阶段的数据共享呢?最典型的例子,估计就是在 log 阶段记录一些请求的特殊变量。
context
是Go中广泛使用的程序包,由Google官方开发,在1.7版本引入。它用来简化在多个go routine传递上下文数据、(手动/超时)中止routine树等操作,比如,官方http包使用context传递请求的上下文数据,gRpc使用context来终止某个请求产生的routine树。由于它使用简单,现在基本成了编写go基础库的通用规范。笔者在使用context上有一些经验,遂分享下。