这边我是用的是Lua53
一些基本的操作可以在Lua菜鸟教程去寻找想要进行的操作:
Lua一般有8个基本类型
nil | 这个最简单,只有值nil属于该类,表示一个无效值(在条件表达式中相当于false)。 |
boolean | 包含两个值:false和true。 |
number | 表示双精度类型的实浮点数 |
string | 字符串由一对双引号或单引号来表示 |
function | 由 C 或 Lua 编写的函数 |
userdata | 表示任意存储在变量中的C数据结构 |
thread | 表示执行的独立线路,用于执行协同程序 |
table | Lua 中的表(table)其实是一个"关联数组"(associative arrays),数组的索引可以是数字、字符串或表类型。在 Lua 里,table 的创建是通过"构造表达式"来完成,最简单构造表达式是{},用来创建一个空表。 |
函数
lua中也可以定义函数,类似于java中的方法。例如:
--[[ 函数返回两个值的最大值 --]]
function max(num1, num2)
if (num1 > num2) then
result = num1;
else
result = num2;
end
return result;
end
-- 调用函数
print("两值比较最大值为 ",max(10,4))
print("两值比较最大值为 ",max(5,6))
执行之后的结果:
两值比较最大值为 10
两值比较最大值为 6
..:表示拼接
表
table 是 Lua 的一种数据结构用来帮助我们创建不同的数据类型,如:数组、字典等。
Lua也是通过table来解决模块(module)、包(package)和对象(Object)的。
案例:
-- 初始化表mytable = {}
-- 指定值mytable[1]= "Lua"
-- 移除引用mytable = nil
-- 文件名为 module.lua
-- 定义一个名为 module 的模块
module = {}
-- 定义一个常量
module.constant = "这是一个常量"
-- 定义一个函数
function module.func1()
print("这是一个公有函数")
end
local function func2()
print("这是一个私有函数!")
end
function module.func3()
func2()
end
return module
由上可知,模块的结构就是一个 table 的结构,因此可以像操作调用 table 里的元素那样来操作调用模块里的常量或函数。
上面的 func2 声明为程序块的局部变量,即表示一个私有函数,因此是不能从外部访问模块里的这个私有函数,必须通过模块里的公有函数来调用.
(2)require 函数
require 用于 引入其他的模块,类似于java中的类要引用别的类的效果。
用法:
require("<模块名>")
require"<模块名>"
两种都可以。
我们可以将上面定义的module模块引入使用,创建一个test_module.lua文件,代码如下:
-- test_module.lua 文件
-- module 模块为上文提到到 module.luarequire("module")
print(module.constant)
module.func3()
openResty入门案例
首先要修改配置文件(安装的地方)
D:\openresty-1.15.8.2-win64\conf
D:\openresty-1.15.8.2-win64\conf
用content_by_lua_file来引入一个lua文件
在一些高并发的场景中,我们常常会用到缓存技术,现在我们常用的分布式缓存redis是最知名的,操作redis,我们需要引入redis模块 require "resty.redis"
local function close_redis(red)
if not red then
return
end
-- 释放连接(连接池实现),毫秒
local pool_max_idle_time = 10000
-- 连接池大小
local pool_size = 100
local ok, err = red:set_keepalive(pool_max_idle_time, pool_size)
local log = ngx_log
if not ok then
log(ngx_ERR, "set redis keepalive error : ", err)
end
end
-- 连接redis
local redis = require('resty.redis')
local red = redis.new()
red:set_timeout(1000)
local ip = "127.0.0.1"
local port = "6379"
local pwd= "ok"
ok = red:connect(ip,port)
if not ok then
ngx.say("failed to auth: ", err)
return close_redis(red)
end
if not ok then
return close_redis(red)
end
ok = red:auth(pwd)
if not ok then
ngx.say("failed to auth: ", err)
return close_redis(red)
end
red:select('0')
red:set("msg","test ngx hello")
local resp = red:get("msg")
if not resp then
ngx.say("get msg error : ", err)
return close_redis(red)
end
ngx.say("msg : ", resp)
close_redis(red)
获取POST请求参数
ngx.req.read_body()
local arg = ngx.req.get_post_args()
name=nil
pwd=nil
for k,v in pairs(arg) do
if k=="name" then
name=v
end
if k=="pwd" then
pwd = v
end
end
ngx.say("name : ", name)
ngx.say("pwd : ", pwd)
openresty中操作mysql
--请求参数
ngx.req.read_body()
local arg = ngx.req.get_post_args()
deptname=nil
--获取数据
for k,v in pairs(arg) do
if k=="deptname" then
deptname = v
end
end
ngx.say("deptname : ", deptname)
--创建连接mysql模块
local mysql = require "resty.mysql"
-- connect to mysql;
local db, err = mysql:new()
if not db then
return false
end
db:set_timeout(1000)
--设置连接信息
local ok, err, errno, sqlstate = db:connect{
host = "127.0.0.1",
port = 3306,
database = "bye",
user = "root",
password = "ok"
}
--验证是否连接上
if not ok then
ngx.say("connect mysql failed")
return false
end
if db == false then
ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
return
end
ngx.say("----------插入数据部门----------------","<br/>")
--执行添加
res, err, errcode, sqlstate =
db:query("insert into dept values (null,'"..deptname.."')")
if not res then
ngx.say("insert failed")
return
end
ngx.say("insert rows :", res.affected_rows,", id", res.insert_id, "<br/>")
查询数据并返回json
--请求参数
ngx.req.read_body()
local arg = ngx.req.get_post_args()
deptname=nil
--获取数据
for k,v in pairs(arg) do
if k=="deptname" then
deptname = v
end
end
ngx.say("deptname : ", deptname)
--创建连接mysql模块
local mysql = require "resty.mysql"
-- connect to mysql;
local db, err = mysql:new()
if not db then
return false
end
db:set_timeout(1000)
--设置连接信息
local ok= db:connect{
host = "127.0.0.1",
port = 3306,
database = "bye",
user = "root",
password = "ok",
max_packet_size = 1024 * 1024
}
--验证是否连接上
if not ok then
ngx.say("connect mysql failed")
return false
end
if db == false then
ngx.exit(ngx.HTTP_INTERNAL_SERVER_ERROR)
return
end
ngx.say("----------根据名称查询数据部门----------------","<br/>")
res =
db:query("SELECT * FROM `dept` WHERE deptname LIKE '%"..deptname.."%'")
if not res then
ngx.say("bad result: ", err, ": ", errcode, ": ", sqlstate, ".")
return
end
local cjson = require "cjson"
ngx.say("result: ", cjson.encode(res))