背景目前系统是前后端分离的,API采用restful风格设计。随着业务的发展,一个页面的数据需要请求多个接口才能充分展示数据。这导致页面加载需要很长时间。因此,我决定使用openresty并发请求客户端发送的接口地址,然后一次性将多个接口的数据返回给前端。这样前端只需要向服务器请求一次。接口也可以任意组合。使用的框架是laravel。每个接口地址都必须指定请求方法才能访问。Lua语法Lua特殊点1.默认变量和函数是全局的。谨慎使用。使用局部修饰符。2、字符串和数组下标都是从1开始的,数据类型nil为空。未赋值的变量为nil。将nil分配给全局变量等同于删除它。booleanbooleannil和false在lua中都是false。其他人是真的。0和空字符串也是真数numbers用来表示实数。math.floor向下舍入。math.ceil被四舍五入。lua中的String字符串是不能改变的,也不能通过下标访问一个字符。在lua中,两个相同的lua字符只会在虚拟机中存入一个字符串。每个字符串在创建时都会被插入到lua虚拟机内部的一个全局哈希表中。table表类型实现了一个抽象的关联数组。localcorp={name="kang",age=20}functionlua中的函数。函数也是一种数据类型。函数可以存储在变量中,并通过参数传递给其他函数。Han可以作为函数的返回值。局部函数foo()局部x=10;本地y=20;返回x+y;结束;本地a=foo;a();2.表达式算术运算符加+减-乘*除/指数^余数%关系运算符小于<大于>小于等于<=大于等于>=等于==不等于~=逻辑运算符and和ornot字符使用运算符“..”(两个点)连接。如果其中任何一个是数字,将把这个数字转换成一个字符串。也可以使用字符串库的函数string.format来拼接strings.stringg.format("%s-%s","你好","word");hello-word推荐使用table.concat()进行字符串拼接。因为lua中的字符串是只读的。连接操作将创建一个新字符串。高性能损失。三。表达式1.Singleifbranchx=10ifx>0thenprint(x);end;2。两个分支if-elsex=10ifx>0thenprint(0);elseprint(1)end;3。多个分支if-elseif-elsescore=10ifscore==10thenprint(1)elseifscore==11thenprint(2)elseprint(3)end;4。whie控制结构whileexpression==truedotodoend;x=1sum=0whilex<=5dosum=sum+x;x=x+1;end;5.repeat控制结构类似于do-while语句repeattodountilcondition==false6.fordigitalforvar=begin,finish,stepdotodoend;step默认为1fori=1,5,1doprint(i);end;genericgenericfor循环通过迭代器函数遍历所有权.locala={"a","b","c"}fori,vinipairs(a)doprint(i,鬻;lua的基础库提供了ipairs。这是一个遍历数组的方法迭代器函数用于迭代文件中的每一行(io.lines)、迭代表元素(pairs)、迭代数组元素(ipairs)、迭代字符串中的单词(string.gmatch)函数定义函数名(arc)todoend;name=function(arc)end;所有没有局部修改的变量都是全局变量。因此,在函数声明中也应该使用局部函数。一个field.functionstu.getName()todoend;函数的参数Lua函数的大部分参数都是按值传递的。调用函数时,如果形参个数和实参个数不同,Lua会自动调整实参个数。调整规则:如果实参个数大于形参个数,从左到右,忽略多余的实参;如果实参个数小于形参个数,从左到右,未被实参初始化的形参将被初始化为nil。变长参数如果形参是...,函数可以接收不同长度的参数。访问参数时,还必须使用...localfunctionfunc(...)localtmp={...}fork,vinpairs(tmp)doprint(v)end;end;的返回值functionlua允许函数返回多个值。locas,e=string.find("helloword","llo");返回字符串的开头和结尾当下标返回多个值时,值之间用“,”分隔。调整规则:如果返回值个数大于接收变量个数,多余的返回值将被忽略;如果返回值个数小于参数个数,从左到右,没有被返回值初始化的变量会被初始化为nil。注意:当一个函数有多个返回值,并且函数调用不是列表表达式的最后一个元素时,那么函数调用只会产生一个返回值,即第一个返回值。localfunctioninit()--init函数返回两个值1and"lua"return1,"lua"endlocalx,y,z=init(),2--init函数的位置不在end,此时只返回1print(x,y,z)-->output12nillocala,b,c=2,init()--init函数的位置在最后,此时timereturn1and"lua"print(a,b,c)-->output21lua模块从lua5.1开始。它增加了对模块和包的支持。模块的数据结构是lua值(通常是lua表或lua函数)。您可以使用require()来加载和缓存模块。定义一个模块my.lualocalfoo={}localfunctiongetname()return"Lucy"endfunctionfoo.greeting()print("hello"..getname())endreturnfoo定义一个main.lua。callmy.luamodulelocalfp=require("my")fp.greeting()-->output:helloLucymetatablesetmetatable(table,metatable)该方法用于为表设置metatablegetmetatable(table)获取表的Metatableobjectlocalmytable={}localmetatable={}setmetatable(mytable,metatable);ormytable=setmetatable({},{})通过重载“__add”元方法来计算集合的并集来修改表运算符行为;localtable_1={10,20,30};localtable_2={40,50,60};localmetatable={};metatable.__add=function(self,another)localsum={};叉,vinpairs(self)做table.insert(sum,v);结尾;对于k,v成对(另一个)做table.insert(sum,v);结束返回总和;结束;设置元表(表_1,元表);表_3=表_1+表_2;fork,vinpairs(table_3)doprint(v)end除了加法可以重载之外,Lua提供的所有运算符都可以重载:meta-methodmeaning"__add"+operation"__sub"-operationactslike"add"operation"__mul"*operation像"add"operation"__div"/operation像"add"operation"__mod"%operation像"add"operation"__pow"^(exponentiation)operation像"add"operation"__unm"unary-operation"__concat"..(stringconcatenation)operation"__len"#operation"__eq"==operationfunctiongetcomphandlerdefinesHowdoesLuachooseaprocessortodothecomparisonoperation只有当两个对象是相同类型且具有相同操作对应的元方法"__lt"<操作"__le"<=操作除了操作符之外,下面的元方法也可以重载,下面依次说明使用方法:Meta方法含义"__index"下标操作用于访问table[key]"__newindex"给指定下标赋值table[key]=value"__tostring"转换为字符串"__call"Lua调用value时调用"__mode”用于weaktable(周表)“__metatable”用于保护metatable不被访问Openresty的组合设计和安装推荐使用官网教程https://openresty.org/cn/inst...configurenginx使用luallocation/kang{add_header内容类型应用程序/json;content_by_lua_filelua/kang.lua;}lua代码--加载json库localjson=require"cjson";--获取请求方法localrequest_method=ngx.var.request_method;--判断请求方法ifrequest_method=="GET"thenngx.say(json.encode({"仅发布"}));return;end;--读取post参数。形式需要x-www-form-urlencodedngx.req.read_body();localapi_p=ngx.req.get_post_args();--拼接子请求locallist={};对于api,p成对(api_p)做本地tmp={api,{args=p,method=ngx.HTTP_GET}};table.insert(list,tmp);end;--发送子请求本地响应={ngx.location.capture_multi(list)};--合并响应本地数据={};fornum,respinpairs(response)doresp=json.decode(resp["body"]);data[resp["uri"]]=resp;end;--响应客户端ngx.say(json.encode(data));坑0.请求分为父请求和子请求。父请求是客户端请求nginx服务器。子请求是catpure_multi,捕获函数发起的请求。1.发出子请求时,必须指定子请求的请求方法。否则默认使用父请求的请求方法2.nginx的内置变量$request_uri只能获取父请求。如果要获取子请求,需要使用第三方库ngx_echo提供的内置变量$echo_request_method3。你无法在php中获取子请求。需要通过fastcgi_param传给php配置locationlocation/api{#记录下子请求的请求方式,uriset$my_uri$uri;设置$my_method$echo_request_method;根/var/www/html;indexindex.htmlindex.htm;try_files$uri$uri//index.php?$query_string;access_log/usr/local/openresty/nginx/logs/access.logmain;}location~\.php{root/var/www/html/laravel/public;包括fastcgi_params;#fastcgi_passunix:/home/wenba/php/var/run/php.sock;fastcgi_pass127.0.0.1:9000;fastcgi_split_path_info^((?U).+\.php)(/?.+)$;fastcgi_indexindex.php;fastcgi_paramREQUEST_URI$my_uri;fastcgi_paramREQUEST_METHOD$my_method;fastcgi_paramSCRIPT_NAME$fastcgi_script_name;fastcgi_paramSCRIPT_FILENAME$document_root$fastcgi_script_name;}请问
