专栏首页码匠的流水账openresty下lua的function定义及调用

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查找的路径下面,否则会报错。

doc

  • 调用代码前先定义函数
  • OpenResty如何在一个lua文件调用另一个lua文件的函数

本文分享自微信公众号 - 码匠的流水账(geek_luandun)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-03-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 聊聊rocketmq-client-go的localFileOffsetStore

    本文主要研究一下rocketmq-client-go的localFileOffsetStore

    codecraft
  • 聊聊rocketmq-client-go的localFileOffsetStore

    本文主要研究一下rocketmq-client-go的localFileOffsetStore

    codecraft
  • 聊聊lettuce的sentinel连接

    lettuce-core-5.0.4.RELEASE-sources.jar!/io/lettuce/core/RedisClient.java

    codecraft
  • 用AI教直男恋爱、手残做菜、防诈骗,愚人节的百度、阿里、腾讯好嗨哟!

    今天百度在官方微信公众号宣布“入圈”进军社交,还上线了新产品——“丘比特”;腾讯推出全球首款美食AI——“风味探测器”小程序;阿里巴巴旗下的支付宝则发布了首款防...

    镁客网
  • 如何研究UI5的库文件是如何从本地仓库加载的

    The knowledge contained in this issue is prerequisite for another [issue](How to...

    Jerry Wang
  • 如何研究UI5的库文件是如何从本地仓库加载的

    The knowledge contained in this issue is prerequisite for another [issue](How to...

    Jerry Wang
  • VBA解压缩ZIP文件03——解压准备工作

    要解压缩ZIP文件,所以肯定需要读写文件的功能,为了方便,把VBA中对文件的读写功能进行一个简单的封装,方便使用。

    xyj
  • mac下lua快速搭建

    SeanDepp
  • “网络大V”陈杰人给地方政府上了 一堂印象深刻的舆情课

      近年来,随着互联网行业蓬勃发展,网络舆论监督也逐渐成为了各级政府关注的焦点。近日,新华社发表了一篇题为《从“网络大V”到“网络害虫”——陈杰人涉嫌敲诈勒索、...

    用户2144054
  • Salesforce CEO 贝尼奥夫透露收购 SteelBrick 背后原因

    去年年底,Salesforce 宣布 以 3.6 亿美元的价格收购报价软件开发商 SteelBrick,这一消息当时令业内人士颇感意外。在前几日举行的 Sale...

    臭豆腐

扫码关注云+社区

领取腾讯云代金券