Lua简单入门

一、介绍
    轻量、小巧的脚本语言,用标准的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        

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值