• nginx中的Lua


    Lua的搜索包的方法:

      就是把?替换成你需要加载的模块的相对路径,?可以理解为占位符。

      首次加载:local default_conf   =  require('plugins.config_default')

      再次加载:

        package.loaded['plugins.config_default']这个可以动态的添加表也可以添加一些lua静态文件的表

        require('plugins.config_default')这个是添加一些lua静态文件的表

    lua_package_path "$prefix/../lualib/?.lua;$prefix/luaext/?.lua;$prefix/luaext/vendor/?.lua;;";
    lua_package_cpath "$prefix/../lualib/?.so;;";

     定义一个Lua模块:

    local _M = {
    }
    
    --成员变量
    _M._VERSION = '1.0.0'
    _M._DESCRIPTION = 'test desc'
    
    --局部变量
    local msb_router=  require('core.router')
    local table_insert = table.insert
    local string_find = string.find
    local str_low = string.lower
    local ngx_var = ngx.var
    
    --成员函数
    function _M.route()    
    end
    
    --私有函数
    local function prepare_route()
    end
    
    return _M

    Lua的面向对象:

      self就是指冒号前面的东西,也就是指调用者自己。 

      当你通过键来访问 table 的时候,如果这个键没有值,那么Lua就会寻找该table的metatable(假定有metatable)中的__index 键。如果__index包含一个表格,Lua会在表格中查找相应的键。

    local Object = {}
    Object.__index = Object --为了让别人继承自己
    
    
    function Object:new()
    end
    
    
    function Object:extend()
      local cls = {} --创建新表
      for k, v in pairs(self) do --复制固有属性(__call,__index,__tostring)
        if k:find("__") == 1 then
          cls[k] = v
        end
      end
      cls.__index = cls --为了让别的类继承自己
      cls.super = self  --指定父类
      setmetatable(cls, self) --设定元表,落实继承关系
      return cls --返回创建的新表
    end
    
    
    function Object:implement(...)
      for _, cls in pairs({...}) do
        for k, v in pairs(cls) do
          if self[k] == nil and type(v) == "function" then
            self[k] = v
          end
        end
      end
    end
    
    
    function Object:is(T)
      local mt = getmetatable(self)
      while mt do
        if mt == T then
          return true
        end
        mt = getmetatable(mt)
      end
      return false
    end
    
    
    function Object:__tostring()
      return "Object"
    end
    
    
    function Object:__call(...)
      local obj = setmetatable({}, self)
      obj:new(...)
      return obj
    end
    
    
    return Object

      如果想要继承前面的类Object需要这样写:

    local Object = require "vendor.classic"
    local
    BasePlugin = Object:extend() --基于父类创建新表,这个时候extend函数中self就是Object function BasePlugin:new(name) --覆盖父类函数 self._name = name end function BasePlugin:access() --子类新加的函数 end function BasePlugin:header_filter() --子类新加的函数 end return BasePlugin

      如果想要继承BasePlugin需要这样写:

    local BasePlugin = require "plugins.base_plugin"
    local RedirectTransformerPluginHandler = BasePlugin:extend() --基于父类BasePlugin创建表,这个时候在extend函数中self的值就是BasePlugin
    
    function RedirectTransformerPluginHandler:new()
        RedirectTransformerPluginHandler.super.new(self, "redirect-transformer-plugin") --调用父类的同名函数
    end
    
    function RedirectTransformerPluginHandler:header_filter()
        RedirectTransformerPluginHandler.super.header_filter(self) --调用父类的同名函数
        
    end
    
    return RedirectTransformerPluginHandler

    Lua的缓冲:

      代码的缓冲:

        语法:lua_code_cache on | off

        默认:lua_lua_cache on

        上下文:http, server, location, location if;一般在server之外

      

    Lua的库函数:

      Lua中的库函数,都是可以直接使用的,不需要require

      Lua的table库函数insert、remove、concat、sort详细介绍

      Lua中的string库

    nginx+lua的命令:

      init_by_lua后面只能跟字符串

      init_by_lua_block后面是用{}抱起来的Lua语句

      init_by_lua_file后面加Lua文件

      init_by_lua:在nginx启动时执行,位置在server之外

      init_worker_by_lua:在worker进程启动时执行,位置在server之外

      init_by_lua和init_worker_by_lua中定义的变量为全局变量

    参考文献:

    https://www.cnblogs.com/jimodetiantang/p/9257819.html

    Lua参考手册:https://www.codingnow.com/2000/download/lua_manual.html

  • 相关阅读:
    Qt编写控件属性设计器12-用户属性
    C#中通过三边长判断三角形类型(三角形测试用例)
    C#中通过Selenium定位<a>标签的问题
    SharePoint自动化系列——Manage "Site Subscriptions" using PowerShell
    SharePoint API测试系列——Records.BypassLocks测试
    SharePoint API测试系列——对Recorded Item做OM操作(委托的妙用)
    放松时刻——C#分割字符串
    链表——PowerShell版
    栈——PowerShell版
    队列——PowerShell版
  • 原文地址:https://www.cnblogs.com/erdanyang/p/10801732.html
Copyright © 2020-2023  润新知