日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

第四章 Lua模块开发

發布時間:2024/9/20 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 第四章 Lua模块开发 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在實際開發中,不可能把所有代碼寫到一個大而全的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.so

resty/

?? aes.lua

?? core.lua

?? dns/

?? lock.lua

?? lrucache/

?? lrucache.lua

?? md5.lua

?? memcached.lua

?? mysql.lua

?? random.lua

?? redis.lua

?? ……

?

?

需要注意在使用前需要將庫在nginx.conf中導入:

Java代碼??
  • #lua模塊路徑,其中”;;”表示默認搜索路徑,默認到/usr/servers/nginx下找??
  • lua_package_path?"/usr/example/lualib/?.lua;;";??#lua?模塊??
  • lua_package_cpath?"/usr/example/lualib/?.so;;";??#c模塊???
  • 使用方式是在lua中通過如下方式引入

    Java代碼??
  • local?cjson?=?require(“cjson”)??
  • local?redis?=?require(“resty.redis”)???
  • 接下來我們來開發一個簡單的lua模塊。

    Java代碼??
  • vim?/usr/example/lualib/module1.lua??
  • Java代碼??
  • 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

    Java代碼??
  • vim?/usr/example/lua/test_module_1.lua??
  • Java代碼??
  • local?module1?=?require("module1")??
  • ??
  • module1.hello()??
  • ?使用 local var = require("模塊名"),該模塊會到lua_package_path和lua_package_cpath聲明的的位置查找我們的模塊,對于多級目錄的使用require("目錄1.目錄2.模塊名")加載。

    ?

    example.conf配置

    Java代碼??
  • 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 : 1

    count :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存儲。


    來源:http://jinnianshilongnian.iteye.com/blog/2187067

    總結

    以上是生活随笔為你收集整理的第四章 Lua模块开发的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。