当前位置: 首页 > news >正文

大庆网站建设wordpress ueditor 代码 转义

大庆网站建设,wordpress ueditor 代码 转义,博采网络,简洁的网站地图模板文章目录 四、Nginx的扩展模块4.1. Lua4.1.1 概念4.1.2 特性4.1.3 应用场景4.1.4 Lua的安装4.1.5 Lua的语法4.1.5.1 第一个Lua程序4.1.5.2 Lua的注释4.1.5.3 标识符4.1.5.4 关键字4.1.5.5 运算符4.1.5.6 全局变量局部变量4.1.5.7 Lua数据类型nilbooleannumberstringtablef… 文章目录 四、Nginx的扩展模块4.1. Lua4.1.1 概念4.1.2 特性4.1.3 应用场景4.1.4 Lua的安装4.1.5 Lua的语法4.1.5.1 第一个Lua程序4.1.5.2 Lua的注释4.1.5.3 标识符4.1.5.4 关键字4.1.5.5 运算符4.1.5.6 全局变量局部变量4.1.5.7 Lua数据类型nilbooleannumberstringtablefunctionthreaduserdata 4.1.5.8 Lua控制结构if then elseif elsewhile循环repeat循环for循环 4.2. ngx_lua模块概念4.3. ngx_lua模块环境准备4.3.1. 方式一:lua-nginx-module4.3.2. 方式二:OpenRestry概述安装 4.4. ngx_lua的使用init_by_lua*init_worker_by_lua*set_by_lua*rewrite_by_lua*access_by_lua*content_by_lua*header_filter_by_lua*body_filter_by_lua*log_by_lua*balancer_by_lua*ssl_certificate_by_*需求: 4.5. ngx_lua操作Redislua-resty-redis环境准备 4.6. ngx_lua操作Mysql4.6.1 lua-resty-mysql使用lua-resty-mysql实现数据库的查询使用lua-cjson处理查询结果lua-resty-mysql实现数据库的增删改 4.6.2 综合小案例 四、Nginx的扩展模块 Nginx是可扩展的可用于处理各种使用场景。本节中我们将探讨使用Lua扩展Nginx的功能。 4.1. Lua 4.1.1 概念 Lua是一种轻量、小巧的脚本语言用标准C语言编写并以源代码形式开发。设计的目的是为了嵌入到其他应用程序中从而为应用程序提供灵活的扩展和定制功能。 4.1.2 特性 跟其他语言进行比较Lua有其自身的特点 1轻量级 Lua用标准C语言编写并以源代码形式开发编译后仅仅一百余千字节可以很方便的嵌入到其他程序中。2可扩展 Lua提供非常丰富易于使用的扩展接口和机制由宿主语言(通常是C或C)提供功能Lua可以使用它们就像内置的功能一样。3支持面向过程编程和函数式编程 4.1.3 应用场景 Lua在不同的系统中得到大量应用场景的应用场景如下: 游戏开发、独立应用脚本、web应用脚本、扩展和数据库插件、系统安全上。 4.1.4 Lua的安装 在linux上安装Lua非常简单只需要下载源码包并在终端解压、编译即可使用。 Lua的官网地址为:https://www.lua.org 点击download可以找到对应版本的下载地址我们本次课程采用的是lua-5.3.5,其对应的资源链接地址为https://www.lua.org/ftp/lua-5.4.1.tar.gz,也可以使用wget命令直接下载: wget https://www.lua.org/ftp/lua-5.4.1.tar.gz编译安装 cd lua-5.4.1 make linux test make install如果在执行make linux test失败报如下错误: 说明当前系统缺少libreadline-dev依赖包需要通过命令来进行安装 yum install -y readline-devel验证是否安装成功 lua -v4.1.5 Lua的语法 Lua和C/C语法非常相似整体上比较清晰简洁。条件语句、循环语句、函数调用都与C/C基本一致。如果对C/C不太熟悉的同学来说也没关系因为天下语言是一家基本上理解起来都不会太困难。我们一点点来讲。 4.1.5.1 第一个Lua程序 大家需要知道的是Lua有两种交互方式分别是:交互式和脚本式这两者的区别下面我们分别来讲解下 交互式之HELLOWORLD 交互式是指可以在命令行输入程序然后回车就可以看到运行的效果。Lua交互式编程模式可以通过命令lua -i 或lua来启用: 在命令行中key输入如下命令并按回车,会有输出在控制台 脚本式之HELLOWORLD 脚本式是将代码保存到一个以lua为扩展名的文件中并执行的方式。 方式一: 我们需要一个文件名为 hello.lua,在文件中添加要执行的代码然后通过命令 lua hello.lua来执行会在控制台输出对应的结果。 hello.lua print(Hello World!!)方式二: 将hello.lua做如下修改 #!/usr/local/bin/lua print(Hello World!!!)第一行用来指定Lua解释器所在位置为 /usr/local/bin/lua加上#号标记解释器会忽略它。一般情况下#!就是用来指定用哪个程序来运行本文件。但是hello.lua并不是一个可执行文件需要通过chmod来设置可执行权限最简单的方式为: chmod 755 hello.lua然后执行该文件 ./hello.lua补充一点如果想在交互式中运行脚本式的hello.lua中的内容我们可以使用一个dofile函数如 dofile(lua_demo/hello.lua)注意:在Lua语言中连续语句之间的分隔符并不是必须的也就是说后面不需要加分号当然加上也不会报错 在Lua语言中表达式之间的换行也起不到任何作用。如以下四个写法其实都是等效的 写法一 a1 ba2 写法二 a1; ba2; 写法三 a1; ba2; 写法四 a1 ba2不建议使用第四种方式可读性太差。 4.1.5.2 Lua的注释 关于Lua的注释要分两种第一种是单行注释第二种是多行注释。 单行注释的语法为 --注释内容多行注释的语法为: --[[注释内容注释内容 --]]如果想取消多行注释只需要在第一个–之前在加一个-即可如 ---[[注释内容注释内容 --]]4.1.5.3 标识符 换句话说标识符就是我们的变量名Lua定义变量名以一个字母 A 到 Z 或 a 到 z 或下划线 _ 开头后加上0个或多个字母下划线数字0到9。这块建议大家最好不要使用下划线加大写字母的标识符因为Lua的保留字也是这样定义的容易发生冲突。注意Lua是区分大小写字母的。 A0 4.1.5.4 关键字 下列是Lua的关键字大家在定义常量、变量或其他用户自定义标识符都要避免使用以下这些关键字 andbreakdoelseelseifendfalseforfunctionifinlocalnilnotorrepeatreturnthentrueuntilwhilegoto 一般约定以下划线开头连接一串大写字母的名字比如 _VERSION被保留用于 Lua 内部全局变量。这个也是上面我们不建议这么定义标识符的原因。 4.1.5.5 运算符 Lua中支持的运算符有算术运算符、关系运算符、逻辑运算符、其他运算符。 算术运算符: 加法 - 减法 * 乘法 / 除法 % 取余 ^ 乘幂 - 负号例如: 1020 --30 20-10 --10 10*20 --200 20/10 --2 3%2 --1 10^2 --100 -10 ---10关系运算符 等于 ~ 不等于大于小于大于等于小于等于例如: 1010 --true 10~10 --false 2010 --true 2010 --false 2010 --true 2010 --false逻辑运算符 and 逻辑与 A and B or 逻辑或 A or B || not 逻辑非 取反如果为true,则返回false !逻辑运算符可以作为if的判断条件返回的结果如下: A true B trueA and B --true A or B --true not A --falseA true B falseA and B --false A or B --true not A --falseA false B trueA and B --false A or B --true not A --true 其他运算符 .. 连接两个字符串 # 一元预算法返回字符串或表的长度例如: HELLO ..WORLD --HELLO WORLD#HELLO --54.1.5.6 全局变量局部变量 在Lua语言中全局变量无须声明即可使用。在默认情况下变量总是认为是全局的如果未提前赋值默认为nil: 要想声明一个局部变量需要使用local来声明 4.1.5.7 Lua数据类型 Lua有8个数据类型 nil(空无效值) boolean(布尔true/false) number(数值) string(字符串) function(函数) table表 thread(线程) userdata用户数据可以使用type函数测试给定变量或者的类型 print(type(nil)) --nil print(type(true)) -- boolean print(type(1.1*1.1)) -- number print(type(Hello world)) -- string print(type(io.stdin)) --userdata print(type(print)) -- function print(type(type)) --function print(type{}) --table print(type(type(X))) -- stringnil nil是一种只有一个nil值的类型它的作用可以用来与其他所有值进行区分也可以当想要移除一个变量时只需要将该变量名赋值为nil,垃圾回收就会会释放该变量所占用的内存。 boolean boolean类型具有两个值true和false。boolean类型一般被用来做条件判断的真与假。在Lua语言中只会将false和nil视为假其他的都视为真特别是在条件检测中0和空字符串都会认为是真这个和我们熟悉的大多数语言不太一样。 number 在Lua5.3版本开始Lua语言为数值格式提供了两种选择:integer(整型)和float(双精度浮点型)[和其他语言不太一样float不代表单精度类型]。 数值常量的表示方式: 4 --4 0.4 --0.4 4.75e-3 --0.00475 4.75e3 --4750不管是整型还是双精度浮点型使用type()函数来取其类型都会返回的是number type(3) --number type(3.3) --number所以它们之间是可以相互转换的同时具有相同算术值的整型值和浮点型值在Lua语言中是相等的 string Lua语言中的字符串即可以表示单个字符也可以表示一整本书籍。在Lua语言中操作100K或者1M个字母组成的字符串的程序很常见。 可以使用单引号或双引号来声明字符串 a hello b world print(a) --hello print(b) --world如果声明的字符串比较长或者有多行则可以使用如下方式进行声明 html [[ html head titleLua-string/title /head body a hrefhttp://www.lua.orgLua/a /body /html ]]table ​ table是Lua语言中最主要和强大的数据结构。使用表 Lua 语言可以以一种简单、统一且高效的方式表示数组、集合、记录和其他很多数据结构。 Lua语言中的表本质上是一种辅助数组。这种数组比Java中的数组更加灵活可以使用数值做索引也可以使用字符串或其他任意类型的值作索引(除nil外)。 创建表的最简单方式: a {}创建数组: ​ 我们都知道数组就是相同数据类型的元素按照一定顺序排列的集合那么使用table如何创建一个数组呢? arr {TOM,JERRY,ROSE}​ 要想获取数组中的值我们可以通过如下内容来获取: print(arr[0]) nil print(arr[1]) TOM print(arr[2]) JERRY print(arr[3]) ROSE​ 从上面的结果可以看出来数组的下标默认是从1开始的。所以上述创建数组也可以通过如下方式来创建 arr {} arr[1] TOM arr[2] JERRY arr[3] ROSE上面我们说过了表的索引即可以是数字也可以是字符串等其他的内容所以我们也可以将索引更改为字符串来创建 arr {} arr[X] 10 arr[Y] 20 arr[Z] 30当然如果想要获取这些数组中的值可以使用下面的方式 方式一 print(arr[X]) print(arr[Y]) print(arr[Z]) 方式二 print(arr.X) print(arr.Y) print(arr.Z)当前table的灵活不进于此还有更灵活的声明方式 arr {TOM,X10,JERRY,Y20,ROSE,Z30}如何获取上面的值? TOM : arr[1] 10 : arr[X] | arr.X JERRY: arr[2] 20 : arr[Y] | arr.Y ROESE?function 在 Lua语言中函数 Function 是对语句和表达式进行抽象的主要方式。 定义函数的语法为: function functionName(params)end函数被调用的时候传入的参数个数与定义函数时使用的参数个数不一致的时候Lua 语言会通过 抛弃多余参数和将不足的参数设为 nil 的方式来调整参数的个数。 function f(a,b) print(a,b) endf() -- nil nil f(2) -- 2 nil f(2,6) -- 2 6 f(2.6.8) -- 2 6 (8被丢弃)可变长参数函数 function add(...) a,b,c... print(a) print(b) print(c) endadd(1,2,3) -- 1 2 3函数返回值可以有多个这点和Java不太一样 function f(a,b) return a,b endx,yf(11,22) -- x11,y22 thread thread翻译过来是线程的意思在Lua中thread用来表示执行的独立线路用来执行协同程序。 userdata userdata是一种用户自定义数据用于表示一种由应用程序或C/C语言库所创建的类型。 4.1.5.8 Lua控制结构 Lua 语言提供了一组精简且常用的控制结构包括用于条件执行的证 以及用于循环的 while、 repeat 和 for。 所有的控制结构语法上都有一个显式的终结符 end 用于终结 if、 for 及 while 结构 until 用于终结 repeat 结构。 if then elseif else if语句先测试其条件并根据条件是否满足执行相应的 then 部分或 else 部分。 else 部分 是可选的。 function testif(a)if a0 thenprint(a是正数)end endfunction testif(a)if a0 thenprint(a是正数)elseprint(a是负数)end end如果要编写嵌套的 if 语句可以使用 elseif。 它类似于在 else 后面紧跟一个if。根据传入的年龄返回不同的结果如 age18 青少年 age18 , age 45 青年 age45 , age60 中年人 age60 老年人function show(age) if age18 thenreturn 青少年 elseif age18 and age45 thenreturn 青年 elseif age45 and age60 thenreturn 中年人 elseif age60 thenreturn 老年人 end endwhile循环 顾名思义当条件为真时 while 循环会重复执行其循环体。 Lua 语言先测试 while 语句 的条件若条件为假则循环结束否则 Lua 会执行循环体并不断地重复这个过程。 语法 while 条件 do循环体 end例子:实现数组的循环 function testWhile()local i 1while i10 doprint(i)ii1end endrepeat循环 顾名思义 repeat-until语句会重复执行其循环体直到条件为真时结束。 由于条件测试在循环体之后执行所以循环体至少会执行一次。 语法 repeat循环体until 条件function testRepeat()local i 10repeatprint(i)ii-1until i 1 endfor循环 数值型for循环 语法 for paramexp1,exp2,exp3 do循环体 endparam的值从exp1变化到exp2之前的每次循环会执行 循环体并在每次循环结束后将步长(step)exp3增加到param上。exp3可选如果不设置默认为1 for i 1,100,10 do print(i) end泛型for循环 泛型for循环通过一个迭代器函数来遍历所有值类似于java中的foreach语句。 语法 for i,v in ipairs(x) do循环体 endi是数组索引值v是对应索引的数组元素值ipairs是Lua提供的一个迭代器函数用来迭代数组x是要遍历的数组。 例如: arr {TOME,JERRY,ROWS,LUCY} for i,v in ipairs(arr) doprint(i,v) end上述实例输出的结果为 1 TOM 2 JERRY 3 ROWS 4 LUCY但是如果将arr的值进行修改为 arr {TOME,JERRY,ROWS,xJACK,LUCY}同样的代码在执行的时候就只能看到和之前一样的结果而其中的x为JACK就无法遍历出来缺失了数据如果解决呢? 我们可以将迭代器函数变成pairs,如 for i,v in pairs(arr) doprint(i,v) end上述实例就输出的结果为 1 TOM 2 JERRY 3 ROWS 4 LUCY x JACK4.2. ngx_lua模块概念 淘宝开发的ngx_lua模块通过将lua解释器集成进Nginx可以采用lua脚本实现业务逻辑由于lua的紧凑、快速以及内建协程所以在保证高并发服务能力的同时极大地降低了业务逻辑实现成本。 4.3. ngx_lua模块环境准备 4.3.1. 方式一:lua-nginx-module LuaJIT是采用C语言编写的Lua代表的解释器。 官网地址为:http://luajit.org/ 在官网上找到对应的下载地址:http://luajit.org/download/LuaJIT-2.0.5.tar.gz 在centos上使用wget来下载: wget http://luajit.org/download/LuaJIT-2.0.5.tar.gz 将下载的资源进行解压: tar -zxf LuaJIT-2.0.5.tar.gz 进入解压的目录: cd LuaJIT-2.0.5 执行编译和安装: make make install 下载lua-nginx-module 下载地址:https://github.com/openresty/lua-nginx-module/archive/v0.10.16rc4.tar.gz 在centos上使用wget来下载: wget https://github.com/openresty/lua-nginx-module/archive/v0.10.16rc4.tar.gz 将下载的资源进行解压: tar -zxf lua-nginx-module-0.10.16rc4.tar.gz 更改目录名:mv lua-nginx-module-0.10.16rc4 lua-nginx-module 导入环境变量告诉Nginx去哪里找luajit export LUAJIT_LIB/usr/local/lib export LUAJIT_INC/usr/local/include/luajit-2.0进入Nginx的目录执行如下命令: ./configure --prefix/usr/local/nginx --add-module../lua-nginx-module make make install注意事项: 1如果启动Nginx出现如下错误: 解决方案: 设置软链接使用如下命令 ln -s /usr/local/lib/libluajit-5.1.so.2 /lib64/libluajit-5.1.so.22如果启动Nginx出现以下错误信息 分析原因:因为lua-nginx-module是来自openrestry,错误中提示的resty.core是openrestry的核心模块对其下的很多函数进行了优化等工作。以前的版本默认不会把该模块编译进去所以需要使用的话我们得手动安装或者禁用就可以。但是最新的lua-nginx-module模块已经强制性安装了该模块所以此处因为缺少resty模块导致的报错信息。 解决方案有两个:一种是下载对应的模块另一种则是禁用掉restry模块禁用的方式为: http{lua_load_resty_core off; }测试 在nginx.conf下配置如下内容: location /lua{default_type text/html;content_by_lua ngx.say(h1HELLO,LUA/h1); }配置成功后启动nginx,通过浏览器进行访问如果获取到如下结果则证明安装成功。 4.3.2. 方式二:OpenRestry 概述 ​ 前面我们提到过OpenResty是由淘宝工程师开发的所以其官方网站(http://openresty.org/)我们读起来是非常的方便。OpenResty是一个基于Nginx与 Lua 的高性能 Web 平台其内部集成了大量精良的 Lua 库、第三方模块以及大多数的依赖项。用于方便地搭建能够处理超高并发、扩展性极高的动态 Web 应用、Web 服务和动态网关。所以本身OpenResty内部就已经集成了Nginx和Lua所以我们使用起来会更加方便。 安装 (1) 下载OpenRestyhttps://openresty.org/download/openresty-1.15.8.2.tar.gz (2)使用wget下载: wget https://openresty.org/download/openresty-1.15.8.2.tar.gz (3)解压缩: tar -zxf openresty-1.15.8.2.tar.gz (4)进入OpenResty目录: cd openresty-1.15.8.2 (5) 执行命令:./configure (6) 执行命令:make make install (7)进入OpenResty的目录找到nginxcd /usr/local/openresty/nginx/ (8)在conf目录下的nginx.conf添加如下内容 location /lua{default_type text/html;content_by_lua ngx.say(h1HELLO,OpenRestry/h1); } (9)在sbin目录下启动nginx (10)通过浏览器访问测试4.4. ngx_lua的使用 使用Lua编写Nginx脚本的基本构建块是指令。指令用于指定何时运行用户Lua代码以及如何使用结果。下图显示了执行指令的顺序。 先来解释下*的作用 *无 即 xxx_by_lua ,指令后面跟的是 lua指令 *:_file即 xxx_by_lua_file 指令后面跟的是 lua文件 *:_block,即 xxx_by_lua_block 在0.9.17版后替换init_by_lua_fileinit_by_lua* 该指令在每次Nginx重新加载配置时执行可以用来完成一些耗时模块的加载或者初始化一些全局配置。init_worker_by_lua* 该指令用于启动一些定时任务如心跳检查、定时拉取服务器配置等。set_by_lua* 该指令只要用来做变量赋值这个指令一次只能返回一个值并将结果赋值给Nginx中指定的变量。rewrite_by_lua* 该指令用于执行内部URL重写或者外部重定向典型的如伪静态化URL重写本阶段在rewrite处理阶段的最后默认执行。access_by_lua* 该指令用于访问控制。例如如果只允许内网IP访问。content_by_lua* 该指令是应用最多的指令大部分任务是在这个阶段完成的其他的过程往往为这个阶段准备数据正式处理基本都在本阶段。header_filter_by_lua* 该指令用于设置应答消息的头部信息。body_filter_by_lua* 该指令是对响应数据进行过滤如截断、替换。log_by_lua* 该指令用于在log请求处理阶段用Lua代码处理日志但并不替换原有log处理。balancer_by_lua* 该指令主要的作用是用来实现上游服务器的负载均衡器算法ssl_certificate_by_* 该指令作用在Nginx和下游服务开始一个SSL握手操作时将允许本配置项的Lua代码。需求: http://192.168.200.133?name张三gender1 Nginx接收到请求后根据gender传入的值如果gender传入的是1则在页面上展示 张三先生,如果gender传入的是0则在页面上展示张三女士,如果未传或者传入的不是1和2则在页面上展示张三。实现代码 location /getByGender {default_type text/html;set_by_lua $name local uri_args ngx.req.get_uri_args()gender uri_args[gender]name uri_args[name]if gender1 thenreturn name..先生elseif gender0 thenreturn name..女士elsereturn nameend;header_filter_by_lua ngx.header.aaabbb;return 200 $name; }4.5. ngx_lua操作Redis Redis在系统中经常作为数据缓存、内存数据库使用在大型系统中扮演着非常重要的作用。在Nginx核心系统中Redis是常备组件。Nginx支持3种方法访问Redis,分别是HttpRedis模块、HttpRedis2Module、lua-resty-redis库。这三种方式中HttpRedis模块提供的指令少功能单一适合做简单缓存HttpRedis2Module模块比HttpRedis模块操作更灵活功能更强大。而Lua-resty-redis库是OpenResty提供的一个操作Redis的接口库可根据自己的业务情况做一些逻辑处理适合做复杂的业务逻辑。所以本次课程将主要以Lua-resty-redis来进行讲解。 lua-resty-redis环境准备 步骤一:准备一个Redis环境 连接地址 host 192.168.200.111 port6379步骤二:准备对应的API lua-resty-redis提供了访问Redis的详细API包括创建对接、连接、操作、数据处理等。这些API基本上与Redis的操作一一对应。 1redis require resty.redis 2new语法: redis,err redis:new(),创建一个Redis对象。 3connect语法:ok,errredis:connect(host,port[,options_table]),设置连接Redis的连接信息。ok:连接成功返回 1连接失败返回nilerr:返回对应的错误信息 4set_timeout语法: redis:set_timeout(time) 设置请求操作Redis的超时时间。 5close语法: ok,err redis:close(),关闭当前连接成功返回1失败返回nil和错误信息 6redis命令对应的方法在lua-resty-redis中所有的Redis命令都有自己的方法方法名字和命令名字相同只是全部为小写。 步骤三:效果实现 location / {default_type text/html;content_by_lua_block{local redis require resty.redis -- 引入Redislocal redisObj redis:new() --创建Redis对象redisObj:set_timeout(1000) --设置超时数据为1slocal ok,err redisObj:connect(192.168.200.1,6379) --设置redis连接信息if not ok then --判断是否连接成功ngx.say(failed to connection redis,err)returnendok,err redisObj:set(username,TOM)--存入数据if not ok then --判断是否存入成功ngx.say(failed to set username,err)returnendlocal res,err redisObj:get(username) --从redis中获取数据ngx.say(res) --将数据写会消息体中redisObj:close()} }步骤四:运行测试效果 4.6. ngx_lua操作Mysql MySQL是一个使用广泛的关系型数据库。在ngx_lua中MySQL有两种访问模式,分别是使 1用ngx_lua模块和lua-resty-mysql模块这两个模块是安装OpenResty时默认安装的。 2使用drizzle_nginx_module(HttpDrizzleModule)模块需要单独安装这个库现不在OpenResty中。 4.6.1 lua-resty-mysql lua-resty-mysql是OpenResty开发的模块使用灵活、功能强大适合复杂的业务场景同时支持存储过程的访问。 使用lua-resty-mysql实现数据库的查询 步骤一: 准备MYSQL host: 192.168.200.111 port: 3306 username:root password:123456创建一个数据库表及表中的数据。 create database nginx_db;use nginx_db;create table users(id int primary key auto_increment,username varchar(30),birthday date,salary double );insert into users(id,username,birthday,salary) values(null,TOM,1988-11-11,10000.0); insert into users(id,username,birthday,salary) values(null,JERRY,1989-11-11,20000.0); insert into users(id,username,birthday,salary) values(null,ROWS,1990-11-11,30000.0); insert into users(id,username,birthday,salary) values(null,LUCY,1991-11-11,40000.0); insert into users(id,username,birthday,salary) values(null,JACK,1992-11-11,50000.0);数据库连接四要素: driverClasscom.mysql.jdbc.Driver urljdbc:mysql://192.168.200.111:3306/nginx_db usernameroot password123456步骤二:API学习 1引入resty.mysql模块local mysql require resty.mysql 2new创建一个MySQL连接对象遇到错误时db为nilerr为错误描述信息语法: db,err mysql:new() 3connect尝试连接到一个MySQL服务器语法:ok,errdb:connect(options),options是一个参数的Lua表结构里面包含数据库连接的相关信息host:服务器主机名或IP地址port:服务器监听端口默认为3306user:登录的用户名password:登录密码database:使用的数据库名 4set_timeout设置子请求的超时时间(ms)包括connect方法语法:db:set_timeout(time) 5close关闭当前MySQL连接并返回状态。如果成功则返回1如果出现任何错误则将返回nil和错误描述。语法:db:close() 6send_query异步向远程MySQL发送一个查询。如果成功则返回成功发送的字节数如果错误则返回nil和错误描述语法:bytes,errdb:send_query(sql) 7read_result从MySQL服务器返回结果中读取一行数据。res返回一个描述OK包或结果集包的Lua表,语法:res, err, errcode, sqlstate db:read_result() res, err, errcode, sqlstate db:read_result(rows) :rows指定返回结果集的最大值默认为4如果是查询则返回一个容纳多行的数组。每行是一个数据列的key-value对如{{id1,usernameTOM,birthday1988-11-11,salary10000.0},{id2,usernameJERRY,birthday1989-11-11,salary20000.0}}如果是增删改则返回类上如下数据{insert_id 0,server_status2,warning_count1,affected_rows2,messagenil}返回值:res:操作的结果集err:错误信息errcode:MySQL的错误码比如1064sqlstate:返回由5个字符组成的标准SQL错误码比如42000 步骤三:效果实现 location /{content_by_lua_block{local mysql require resty.mysqllocal db mysql:new()local ok,err db:connect{host192.168.200.111,port3306,userroot,password123456,databasenginx_db}db:set_timeout(1000)db:send_query(select * from users where id 1)local res,err,errcode,sqlstate db:read_result()ngx.say(res[1].id..,..res[1].username..,..res[1].birthday..,..res[1].salary)db:close()}}问题: 1.如何获取返回数据的内容 2.如何实现查询多条数据 3.如何实现数据库的增删改操作使用lua-cjson处理查询结果 通过上述的案例学习read_result()得到的结果res都是table类型要想在页面上展示就必须知道table的具体数据结构才能进行遍历获取。处理起来比较麻烦接下来我们介绍一种简单方式cjson使用它就可以将table类型的数据转换成json字符串把json字符串展示在页面上即可。具体如何使用? 步骤一引入cjson local cjson require cjson步骤二调用cjson的encode方法进行类型转换 cjson.encode(res) 步骤三:使用 location /{content_by_lua_block{local mysql require resty.mysqllocal cjson require cjsonlocal db mysql:new()local ok,err db:connect{host192.168.200.111,port3306,userroot,password123456,databasenginx_db}db:set_timeout(1000)--db:send_query(select * from users where id 2)db:send_query(select * from users)local res,err,errcode,sqlstate db:read_result()ngx.say(cjson.encode(res))for i,v in ipairs(res) dongx.say(v.id..,..v.username..,..v.birthday..,..v.salary)enddb:close()}}lua-resty-mysql实现数据库的增删改 优化send_query和read_result 本方法是send_query和read_result组合的快捷方法。 语法: res, err, errcode, sqlstate db:query(sql[,rows])有了该API上面的代码我们就可以进行对应的优化如下: location /{content_by_lua_block{local mysql require resty.mysqllocal db mysql:new()local ok,err db:connect{host192.168.200.1,port3306,userroot,password123456,databasenginx_db,max_packet_size1024,compact_arraysfalse}db:set_timeout(1000)local res,err,errcode,sqlstate db:query(select * from users)--local res,err,errcode,sqlstate db:query(insert into users(id,username,birthday,salary) values(null,zhangsan,2020-11-11,32222.0))--local res,err,errcode,sqlstate db:query(update users set usernamelisi where id 6)--local res,err,errcode,sqlstate db:query(delete from users where id 6)db:close()}}4.6.2 综合小案例 使用ngx_lua模块完成Redis缓存预热。 分析: 1先得有一张表(users) 2浏览器输入如下地址 http://191.168.200.133?usernameTOM3从表中查询出符合条件的记录此时获取的结果为table类型 4使用cjson将table数据转换成json字符串 5将查询的结果数据存入Redis中 init_by_lua_block{redis require resty.redismysql require resty.mysqlcjson require cjson } location /{default_type text/html;content_by_lua_block{--获取请求的参数usernamelocal param ngx.req.get_uri_args()[username]--建立mysql数据库的连接local db mysql:new()local ok,err db:connect{host192.168.200.111,port3306,userroot,password123456,databasenginx_db}if not ok thenngx.say(failed connect to mysql:,err)returnend--设置连接超时时间db:set_timeout(1000)--查询数据local sql ;if not param thensqlselect * from userselsesqlselect * from users where username....param..endlocal res,err,errcode,sqlstatedb:query(sql)if not res thenngx.say(failed to query from mysql:,err)returnend--连接redislocal rd redis:new()ok,err rd:connect(192.168.200.111,6379)if not ok thenngx.say(failed to connect to redis:,err)returnendrd:set_timeout(1000)--循环遍历数据for i,v in ipairs(res) dord:set(user_..v.username,cjson.encode(v))endngx.say(success)rd:close()db:close()}}
http://www.hkea.cn/news/14456419/

相关文章:

  • 不同网站对商家做o2o的政策品牌建设论文参考文献
  • 福州自适应网站建设专业网站建设费用报价
  • win7 iis 默认网站属性一流的盐城网站建设
  • 手机网站优化排名php网站开发外包
  • 天津建设工程信息网站今天深圳大事件新闻
  • 网站做支付链接安全吗网站首页上的动画是咋做的
  • 东莞网站优化找哪家住建厅报名考试入口
  • 网站邮件设置网站策划的步骤
  • 网上购物网站大全建站之星模板制作
  • 双辽建设局网站成都网站建设制作设计
  • 湖北公司响应式网站建设推荐做销售的什么网站好
  • 案例分析网站用wordpress做的网站
  • 简单大气食品农业网站源码网站搭建平台流程
  • 电脑做网站服务器哪家建公司网站
  • 最好的科技资讯网站国外引流推广平台
  • 宜宾市规划建设局网站关于网站建设请示
  • 泉州seo网站推广太阳能灯网站建设
  • 网站快速备案被退回的几种原因分析wordpress在本地打开很慢
  • 引物在线设计网站wordpress网站被黑了
  • 互联网站产品开发的流程网站搭建响应式
  • 郑州网站建设最低价wordpress页脚如何修改
  • 网站未建设的情况说明app运营专员
  • js网站建设行业协会网站织梦模板
  • 北京优秀的网站建设公司中国域名注册
  • 自建的电子网站如何做推广妇科医院网站优化服务商
  • 住房和建设部执业资格注册中心网站网站美工如何做
  • dede程序数据库还原图文教程★适合dede网站迁移wordpress 超商取货
  • 网站开发费用计入什么二级科目思博企业管理咨询有限公司
  • 深圳设计功能网站建设企业网站需要什么呢
  • 做装修的应该去哪网站找客户wordpress 元素用处