openresty下lua的function定义及调用

文章目录

[隐藏]

  • 源码示例
  • 实例
  • 小结

本文主要研究下如何在openresty下lua的function定义及调用。

源码示例

/usr/local/openresty/lualib/resty/string.lua

-- Copyright (C) by Yichun Zhang (agentzh)      local ffi = require "ffi"  local ffi_new = ffi.new  local ffi_str = ffi.string  local C = ffi.C  local setmetatable = setmetatable  local error = error  local tonumber = tonumber      local _M = { _VERSION = '0.09' }      ffi.cdef[[  typedef unsigned char u_char;    u_char * ngx_hex_dump(u_char *dst, const u_char *src, size_t len);    intptr_t ngx_atoi(const unsigned char *line, size_t n);  ]]    local str_type = ffi.typeof("uint8_t[?]")      function _M.to_hex(s)      local len = #s * 2      local buf = ffi_new(str_type, len)      C.ngx_hex_dump(buf, s, #s)      return ffi_str(buf, len)  end      function _M.atoi(s)      return tonumber(C.ngx_atoi(s, #s))  end      return _M  
实例

demo.lua

local _M = { _VERSION = '0.01' }  function _M.hello()      ngx.say("hello from demo module!")  end  return _M  

conf

        location /function {              content_by_lua '                  local demo = require("demo")                  demo.hello()              ';          }  

报错

2018/03/26 16:24:15 [error] 5#5: *1 lua entry thread aborted: runtime error: content_by_lua(nginx.conf:69):2: module 'demo' not found:      no field package.preload['demo']      no file '/usr/local/openresty/lualib/demo.lua'      no file '/usr/local/openresty/lualib/demo/init.lua'      no file './demo.lua'      no file '/usr/local/openresty/luajit/share/luajit-2.1.0-beta2/demo.lua'      no file '/usr/local/share/lua/5.1/demo.lua'      no file '/usr/local/share/lua/5.1/demo/init.lua'      no file '/usr/local/openresty/luajit/share/lua/5.1/demo.lua'      no file '/usr/local/openresty/luajit/share/lua/5.1/demo/init.lua'      no file '/usr/local/openresty/lualib/demo.so'      no file './demo.so'      no file '/usr/local/lib/lua/5.1/demo.so'      no file '/usr/local/openresty/luajit/lib/lua/5.1/demo.so'      no file '/usr/local/lib/lua/5.1/loadall.so'  stack traceback:  coroutine 0:      [C]: in function 'require'      content_by_lua(nginx.conf:69):2: in function <content_by_lua(nginx.conf:69):1>, client: 192.168.99.1, server: , request: "GET /function HTTP/1.1", host: "192.168.99.100:8686"  

修复

ADD demo.lua /usr/local/openresty/lualib/demo.lua  
小结

从源码可以看出,基本是定义一个_M变量,里头有个_VERSION属性,然后定义_M的function,最后返回_M。另外注意自己定义的类库需要放在openresty查找的路径下面,否则会报错。

原文出处:segmentfault -> https://segmentfault.com/a/1190000013998664

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。