上周,撸了撸 openresty最佳实践。发现在nginx.conf文件里面可以直接写lua代码。然后在nginx的work线程里面执行lua 代码。
使用这种方式,极大的提升了程序的灵活性,且不需要使用者对C框架非常了解也可以做一些功能开发。
初步了解了一下方法例子如下:
C代码部分
#include <stdio.h>
#include <luajit-2.0/lua.h> //包含lua开发的相关头文件
#include <luajit-2.0/lualib.h>
#include <luajit-2.0/lauxlib.h>
int luaadd(lua_State* L ,int x,int y)
{
int sum;
lua_getglobal(L,"add"); //获取lua脚本中的函数。在lua中函数也是全局变量
lua_pushnumber(L,x); //传入函数的第一个参数
lua_pushnumber(L,y); //传入函数的第二个参数
lua_call(L,2,1); //调用lua函数,2表示两个参数,1表示返回值
sum =(int)lua_tonumber(L,-1); //获取执行结果
lua_pop(L,1); //清空函数调用栈
return sum;
}
int main(int argc,char *argv[])
{
lua_State* L;
int sum;
L = lua_open(); //打开lua虚拟机
luaL_openlibs(L); //加载lua库
luaL_dofile(L,"add.lua"); //加载lua脚本文件
sum=luaadd(L,10,15); //调用lua中的函数。并获取返回值
printf("The sum is %d\n",sum); //打印函数执行结果
lua_close(L); //关闭lua
return 0;
}
lua脚本
--add two numbers
function add(x,y)
--将2个数相加并加上25
return x+y+25
end
编译
gcc -c main.c
gcc -o main -lluajit-5.1
执行 ./main
The sum is 50
我们可以发现lua虚拟机完全嵌在主进程中执行,并没有创建新的进程或线程执行lua虚拟机。