Lua模块开发
来源:互联网 发布:2017网络问卷调查 编辑:程序博客网 时间:2024/06/01 07:54
文章来源:
1 http://jinnianshilongnian.iteye.com/blog/2187067
前言:
开涛的博客—公众号:kaitao-1234567,一如既往的干货分享(http://jinnianshilongnian.iteye.com/blog/2186448)
结合在项目中的实际用法边学边用,并把项目当中用到的一些代码和走过的一些坑在下面的文章中一起说明,一起学习。
在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发;而且模块化是高性能Lua应用的关键。使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每个Worker进程需要时会得到此模块的一个副本(Copy-On-Write),即模块可以认为是每Worker进程共享而不是每Nginx Server共享;另外注意之前我们使用init_by_lua中初始化的全局变量是每请求复制一个;如果想在多个Worker进程间共享数据可以使用ngx.shared.DICT或如Redis之类的存储。
在/usr/example/lualib中已经提供了大量第三方开发库如cjson、redis客户端、mysql客户端:
cjson.soresty/ aes.lua core.lua dns/ lock.lua lrucache/ lrucache.lua md5.lua memcached.lua mysql.lua random.lua redis.lua ……
需要注意在使用前需要将库在nginx.conf中导入:
#lua模块路径,其中”;;”表示默认搜索路径,默认到/usr/servers/nginx下找 lua_package_path "/usr/example/lualib/?.lua;;"; #lua 模块 lua_package_cpath "/usr/example/lualib/?.so;;"; #c模块
使用方式是在lua中通过如下方式引入
local cjson = require(“cjson”) local redis = require(“resty.redis”)
接下来我们来开发一个简单的lua模块。
vim /usr/example/lualib/module1.lua
local count = 0 local function hello() count = count + 1 ngx.say("count : ", count) end local _M = { hello = hello } return _M
开发时将所有数据做成局部变量/局部函数;通过 _M导出要暴露的函数,实现模块化封装。
接下来创建test_module_1.lua
vim /usr/example/lua/test_module_1.lua
local module1 = require("module1") module1.hello()
使用 local var = require(“模块名”),该模块会到lua_package_path和lua_package_cpath声明的的位置查找我们的模块,对于多级目录的使用require(“目录1.目录2.模块名”)加载。
example.conf配置
location /lua_module_1 { default_type 'text/html'; lua_code_cache on; content_by_lua_file /usr/example/lua/test_module_1.lua; }
访问如http://192.168.1.2/lua_module_1进行测试,会得到类似如下的数据,count会递增
count : 1count :2……count :N
此时可能发现count一直递增,假设我们的worker_processes 2,我们可以通过kill -9 nginx worker process杀死其中一个Worker进程得到count数据变化。
假设我们创建了vim /usr/example/lualib/test/module2.lua模块,可以通过local module2 = require(“test.module2”)加载模块。
基本的模块开发就完成了,如果是只读数据可以通过模块中声明local变量存储;如果想在每Worker进程共享,请考虑竞争;如果要在多个Worker进程间共享请考虑使用ngx.shared.DICT或如Redis存储。
- lua 模块开发
- Lua模块开发
- lua开发--lua模块和redis
- 第四章 Lua模块开发
- nginx 模块开发 lua开发学习
- lua开发之--mysql和http模块
- lua—GPRS模块开发之I2C OLED模块驱动
- LUA模块
- lua模块
- lua 模块
- [Lua基础]包package——模块开发
- [Lua基础]包package——模块开发
- C开发lua模块(二) --- 操作table和调用lua函数
- Lua动态加载模块
- lua 重新加载模块
- lua 编译 C模块
- Lua中的模块
- lua不同模块调用
- 「嵌入」(Embedding)如何更好地理解?
- Android开发笔记: Android 百分比布局库(percent-support-lib) 解析与扩展
- gradle 用户手册 第一章(尝试翻译)
- CentOS安装java环境
- svm 相关的一些感想
- Lua模块开发
- Linux下编写sh批处理文件
- 服务熔断、降级、限流、异步RPC -- HyStrix
- scala
- ID3 和 C4.5
- MANAGE TABLESPACE
- 树莓派Android系统下串口GPS模块驱动
- 使用js完成一个类似于小广告的功能,斜着运动,遇到边界弹回
- 导出pdf代码记录