一、介绍
轻量、小巧的脚本语言,用标准的C语言编写并以源代码形式开发,嵌入其他程序从而实现灵活的扩展和定制功能
二、安装
1、下载
1)官网下载:https://www.lua.org
2)wget下载:wget https://www.lua.org/ftp/lua-5.4.6.tar.gz
2、编译安装
1)解压:tar -xzvf lua-5.4.6.tar.gz
2)进入解压目录:cd lua-5.4.6
3)检测系统适配性:make linux test
4)安装:make install
5)验证安装:lua -v
说明:lua二进制执行文件默认在/usr/local/bin目录下
三、操作符
1、交互式
执行lua指令进入交互界面,然后执行指令即可
示例:print("Hello World!!!")
2、脚本式
创建.lua文件,文件首行如下,指定文件的执行指令
#!/usr/local/bin/lua
确保文件有执行权限即可通过./*.lua来执行指令
3、注释指令
1)单行注释
--注释内容
2)多行注释
--[[
注释内容
--]]
说明:取消多行注释可以在--前面再加一个-
示例:---[[
注释内容
--]]
4、常用
1)标识符
即变量名,要求以字母或下划线开头后面可跟0个或多个字母,数字,下划线
2)关键字
and,break,do,else,elseif,end,false,for,function,if,in,local,nil,not,or,repeat,return,then,true,until,while,goto
3)算数运算符
+,-,*,/,%,-,^为幂运算
4)关系运算符
==,~=为不等于,>,>=,<,<=
5)逻辑运算符
and为逻辑与,or为逻辑或,not为逻辑非
6)其他运算符
.. 连接两个字符串
# 一元运算符,返回字符串或表的长度
7)全局和局部变量
全局变量:声明后直接使用
局部变量:使用local声明,只能在当前域内使用
5、数据类型
1)nil
空值或无效值
2)boolean
布尔值,true/false,只有false和nil为假,特殊的0和空字符串会判断为true
3)number
数值,分为整型integer和双精度浮点型float,通过type函数统一返回都是number类型
4)string
字符串,单行声明可使用""或者'',多行时使用[[]]括起来
5)function
函数
声明语法:function functionName(args)
方法体
end
可变参及多个返回值使用示例:function a(...)
local i,j,k=...
print(i,j,k)
return i,j,k
end
方法参数args传递不够或传递过多,lua会自动补nil或抛弃多于参数来自动调整
6)table
表,可以理解为数组,声明方式{}
示例:a={"C","JAVA","Python"} a[1]->C a[2]->JAVA
a={} a["A"]=111 a["B"]=222 a["C"]=333
a["A"]->111 a.A->111
7)thread 线程
8)userdata 用户数据
扩展:获取数值类型type(123)->number
6、逻辑判断
1)if
语法:if 条件1 then
操作1
elseif 条件2 then
操作2
else
操作3
end
2)while
语法:while 条件 do
循环体
end
3)repeat
语法:repeat
循环体
until 条件
4)for
a)数值型循环
语法:for param=arg1,arg2,arg3 do
循环体
end
说明:param的值由arg1步进arg3直到arg2,每次步进都会执行循环体,arg3如果不设置,默认为1
b)泛型循环
类似foreach
语法:for i,j in ipairs(x) do
循环体
end
说明:x为需要便利的数组,i为数组索引,j为索引对应的数组元素值,ipairs为迭代器函数(针对同类型的数值使用ipairs,如果数组中存在不同类型的数字例如"AAA"和X="111",应当使用pairs迭代函数)
四、使用
1、ngx_lua环境准备
1)OpenResty
下载:https://openresty.org/
上传并解压:tar -xzvf openresty-1.15.8.2.tar.gz
进入解压目录:cd openresty-1.15.8.2.tar.gz
预配置:./configure
编译并安装:make&&make install
在nginx的配置文件nginx.conf内添加如下内容
location /lua{
default_type 'text/html';
content_by_lua 'ngx.say("<h1>Hello OpenResty</h1>")';
}
重启nginx,并访问/lua页面测试验证
2、指令介绍
*后无内容则直接跟lua代码;*后接_file,则指令后跟lua文件;*后接_block,0.9.17版本替代了_file的模式
init_by_lua* 每次重新加载nginx配置时执行,做一些初始化配置
init_worker_by_lua* 用于启动一些定时任务,如心跳检查,定时拉取服务器配置等
ssl_certificate_by_lua* 用于nginx和下游服务开始一个ssl握手操作时将允许本配置的lua代码
set_by_lua* 用于做变量赋值,一次只能返回一个值
rewrite_by_lua* 用于执行内部URL重写或这外部重定向,在rewrite处理阶段的最后默认执行
access_by_lua* 用于访问控制
content_by_lua* 应用最多的指令
balancer_by_lua* 用于实现上游服务器的负载均衡算法
header_filter_by_lua* 用于设置应答消息的头部信息
body_filter_by_lua* 对响应数据进行过滤
log_by_lua* 用于在log请求处理阶段,用Lua代码处理日志,但不是替换原有log处理
3、集成Redis
1)介绍
HttpRedis模块功能单一,适合做简单缓存
HttpRedis2Module模块比HttpRedis操作灵活,功能更强
lua-resty-redis是OpenResty提供的接口库,适合做复杂逻辑
2)API
3)示例(使用lua-resty-redis库)
location /redis{
default_type "text/plain";
content_by_lua_block{
--引入redis的接口对象
local redis = require "resty.redis"
--创建redis对象
local redisObj = redis:new()
--设置超时时间
redisObj:set_timeout(1000)
--创建连接
local ok,err = redisObj:connect("redisIP",redisport)
if not ok then
ngx.say("failed to connection redis",err)
return
end
--存入数据
ok,err = redisObj:set("username","TOM")
if not ok then
ngx.say("failed to set userdata",err)
return
end
--获取数据
local res,err = redisObj:get("username")
ngx.say(res)
--关闭连接
redisObj:close()
}
}
4、集成Mysql
1)介绍
lua-resty-mysql是OpenResty提供的接口库
drizzle_nginx_module(HttpDrizzleModule)模块,需要单独安装
2)API
a)引入mysql模块
local mysql = require "resty.mysql"
b)new对象
db,err = mysql:new()
c)connect
ok,err = db:connect(options)
options是lua的表结构,包含host,port,user,password,database
d)set_timeout
单位为ms
db:set_timeout(time)
e)close
关闭成功返回1,关闭失败返回nil和错误描述
db:close()
f)send_query
异步发送一个查询,成功返回字节数,失败返回nil和错误描述
bytes,err = db:send_query(sql)
g)read_result
从mysql服务器返回结果中读取一行数据
res,err,errcode,sqlstate = db:read_result()
res,err,errcode,sqlstate = db:read_result(rows)
res为操作的结果集,err为错误信息,errcode为mysql错误码,sqlstate为标准SQL错误码
rows指定返回结果集的最大值,默认为4
如果是查询,则返回容纳多行的数组,每行的数据以k-v对形式展示
如果是增删改,然会数据如下所示
{insert_id=0,server_status=2,warning_count=1,affected_rows=2,message=mil}
3)示例(使用lua-resty-mysql)
location /mysql{
content_by_lua_block{
--引入mysql模块
local mysql = require "resty.mysql"
--创建连接对象
local db = mysql:new()
--建议连接
local ok,err = db:connect{
host="mysqlip"
port=3306
user="root"
password="pass"
database="mybatis"
}
--设置超时时间
db:set_timeout(1000)
--发送sql语句
db.send_query(sql)
--读取结果
local res,err,errcode,sqlstate = db:read_result()
ngx.say(res[1].字段名1..","..res[2].字段名2)
--关闭连接
db.close()
}
}
4)处理查询结果
lua-cjson
引入cjson
local cjson = require "cjson"
cjson.encode(res)
5)增删改实现
res,err,errcode,sqlstate = db.query(sql[,rows])
6)获取请求参数
ngx.req.get_uri_args()["指定属性名"]
注:ngx_lua中默认函数的说明https://blog.csdn.net/wzj_110/article/details/120332118
09-27
1357
07-31
8万+