OpenResty学习笔记三,


OpenResty学习笔记三

    • Lua 模块开发
    • Hello 模块开发

Lua 模块开发

在实际开发中,不可能把所有代码写到一个大而全的lua文件中,需要进行分模块开发;而且模块化是高性能Lua应用的关键。使用require第一次导入模块后,所有Nginx 进程全局共享模块的数据和代码,每个Worker进程需要时会得到此模块的一个副本(Copy-On-Write),即模块可以认为是每Worker进程共享而不是每Nginx Server共享;另外注意之前我们使用init_by_lua中初始化的全局变量是每请求复制一个;如果想在多个Worker进程间共享数据可以使用ngx.shared.DICT或如Redis之类的存储。

在lualib目录中已经提供了大量第三方开发库如cjson、redis客户端、mysql客户端。

使用前需要将库在nginx.conf中导入:

#lua模块路径,其中”;;”表示默认搜索路径,默认到{prefix}/nginx下找  
lua_package_path "/example/lualib/?.lua;;";  #lua 模块  
lua_package_cpath "/example/lualib/?.so;;";  #c模块   

Hello 模块开发

vi /example/lualib/hello.lua
local count = 0  
local function hello()  
   count = count + 1  
   ngx.say("count : ", count)  
end  
  
local _M = {  
   hello = hello  
}  
return _M  

开发时将所有数据做成局部变量/局部函数;通过 _M导出要暴露的函数,实现模块化封装

使用模块:

local module = require("hello")
module .hello()

使用 local var = require(“模块名”),该模块会到lua_package_path和lua_package_cpath声明的的位置查找我们的模块,对于多级目录的使用require(“目录1.目录2.模块名”)加载

相关内容

    暂无相关文章