亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

Nginx+lua 實現調用.so文件

2024-07-21 23:05:03
字體:
來源:轉載
供稿:網友

最近在和智能硬件部門一起,做一個室內定位的服務,該服務根據手機端傳過來的beacon設備列表,根據一定的算法計算出具體的商場,并將商場ID和beason設備列表作為參數,調用.so文件中的計算方法,得出位置數據(坐標:x、y、z),返回給手機端。

因為服務對QPS要求比較高,并且都是純查詢操作,于是決定使用Nginx+lua+Redis的架構(該架構在公司內部已成主流,比較成熟)。下面我將對lua調用.so文件的方式,做一下介紹。

lua調用.so文件,主要有兩種方式:

1.Lua直接調用動態鏈接庫,具體可參考 技術分享 。
2.使用C寫一個Wrapper。

鑒于第一種方式需要引入第三方工具包,并且效率不高,所以我們采用第二種方式來實現。具體實現過程如下:

1.編寫業務代碼,其中包括業務方法的封裝器。

  static int lua_Locate( lua_State* L )  {    long handle = lua_tonumber( L, 1 );    const char* beacon_rssi_json = lua_tostring( L, 2 );    vector<RSSI_INFO> rssi_info_vec;    FingerprintLocationServer* p = (FingerprintLocationServer*)handle;    ConvertJson2CppRSSI( beacon_rssi_json, rssi_info_vec );    double x;    double y;    float floor;    p->UpdateBeaconSignalGetResult( rssi_info_vec, x, y, floor );    lua_pushnumber(L,x);    lua_pushnumber(L,y);    lua_pushnumber(L,floor);    return 3;  }  static const struct luaL_Reg myLib[] =    {     {"lua_Locate", lua_Locate},     {NULL, NULL}    //數組中最后一對必須是{NULL, NULL},用來表示結束     };   int luaopen_mLualib(lua_State *L)   {     luaL_register(L, "FPCalc", myLib);     return 1;    // 把myLib表壓入了棧中,所以就需要返回1   }

其中,wapper函數的函數名有個命名規則,前綴為luaopen,后面就是lua中require的字符串,否則將會報類似于下面的異常:

lua entry thread aborted: runtime error: error loading module 'mLualib' from file '/var/wdd/wrs/webroot/intelligent_lua/mLualib.so':  /var/wdd/wrs/webroot/intelligent_lua/mLualib.so: undefined symbol: _Z13lua_tolstringP9lua_StateiPmstack traceback:coroutine 0:  [C]: in function 'require'  /var/wdd/wrs/webroot/intelligent_lua/location.lua:18: in function...

另外,如果是.cpp文件,在luaopen_mylib一定要加 extern "C", 否則導出的函數會被重命名,切記切記! 關于extern "C",請參考 extern "C" 用法解析。

2.Nginx配置文件中指定so包所在的文件夾。

lua_package_cpath '/var/wdd/wrs/webroot/intelligent_lua/?.so;;';

注意,這里有很多種配置方式,只要讓lua能找到so文件即可,比如可以通過lua代碼package.cpath來引入(參閱下面代碼段)或者直接把so文件復制lua環境變量指定的目錄里等。
package.cpath = '/usr/local/lib/lua/5.1/?.so;'        --搜索so模塊

如果未指定cpath或者cpath中找不到so文件,系統會報如下異常:

no file './mLualib.lua'  no file '/usr/local/openresty/luajit/share/luajit-2.1.0-beta1/mLualib.lua'  no file '/usr/local/share/lua/5.1/mLualib.lua'  no file '/usr/local/share/lua/5.1/mLualib/init.lua'  no file '/usr/local/openresty/luajit/share/lua/5.1/mLualib.lua'  no file '/usr/local/openresty/luajit/share/lua/5.1/mLualib/init.lua'  no file '/usr/local/openresty/lualib/mLualib.so'  no file './mLualib.so'  no file '/usr/local/lib/lua/5.1/mLualib.so'  no file '/usr/local/openresty/luajit/lib/lua/5.1/mLualib.so'  no file '/usr/local/lib/lua/5.1/loadall.so'  no file '/var/wdd/wrs/webroot/intelligent_lua/mLualib.so'

3.lua代碼中引入so包,并執行調用。

local FPCalc = require "mLualib"local x, y, floor = FPCalc.lua_Locate(c_addr, umm_json)ngx.log(ngx.ERR, "lua_Locate:end:返回結果:", "x=" .. x, " y=" .. y, " floor=" .. floor)

以上就是lua調用.so包全部過程了。

實際壓測過程中,還發現了幾個問題:

1.so包需要在運行環境上編譯,不同的環境編譯的so包不一定通用。比如我在mac上編譯的so包,直接復制到生產環境(centos系統)就不能使用,需要在生產環境重新編譯才可以。

2.編譯so包單進程可以正常執行,但是多進程訪問時異常,錯誤信息如下(目前這個問題還沒有解決)。

2017/05/03 16:52:41 [notice] 14355#0: signal 17 (SIGCHLD) received
2017/05/03 16:52:41 [alert] 14355#0: worker process 14361 exited on signal 11
2017/05/03 16:52:41 [notice] 14355#0: start worker process 14427
2017/05/03 16:52:41 [notice] 14355#0: signal 29 (SIGIO) received
2017/05/03 16:52:41 [notice] 14427#0: sched_setaffinity(0x00000008)

2017-05-04 終于找到原因:

問題原因:進程在訪問.so文件時,需要調用.so中一個初始化方法。這個方法負責初始內存等相關操作,每個進程需要單獨調用(初始化)一次,而我所有進程只調用(初始化)了一次,導致部分未初始化的進程執行代碼時異常。

解決方式:查到原因了,問題就好解決了,每個進程初始一次就好了。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
2021国产精品视频| 久久精品国产欧美激情| 日本免费久久高清视频| 一区二区欧美在线| 欧美日本精品在线| 欧美一级淫片丝袜脚交| 成人福利网站在线观看| 亚洲最新在线视频| 欧美巨大黑人极品精男| 久久99视频精品| 日韩一级裸体免费视频| 久久久久久久久久久国产| 色妞在线综合亚洲欧美| 久久天堂av综合合色| 中文字幕亚洲专区| 亚洲人成欧美中文字幕| 亚洲精品资源在线| 日韩国产高清视频在线| 国产精品永久免费观看| 中文字幕亚洲专区| 日韩二区三区在线| 国产欧美一区二区三区四区| 欧美日韩国产一区二区| 亚洲黄色在线观看| 亚洲专区在线视频| 久久久伊人欧美| 91在线免费视频| 欧美日韩国产麻豆| 精品久久久久久亚洲国产300| 亚洲自拍欧美另类| 热99精品只有里视频精品| 欧美日本高清视频| 成人精品视频在线| 欧美成人精品在线播放| 法国裸体一区二区| 青草青草久热精品视频在线观看| 国产精品一区二区久久国产| 成人在线视频福利| 成人激情视频网| 不卡av电影院| 欧美性69xxxx肥| 青青a在线精品免费观看| 欧美福利视频在线| 久久九九国产精品怡红院| 伊人男人综合视频网| 日韩成人在线网站| 欧美日韩亚洲视频| 国产精品白嫩初高中害羞小美女| 亚洲欧美日韩第一区| 精品自拍视频在线观看| 在线日韩欧美视频| 亚洲影院高清在线| 日韩欧美在线视频免费观看| 国产成人欧美在线观看| 国产精品电影久久久久电影网| 精品女同一区二区三区在线播放| 最近2019年中文视频免费在线观看| 日韩黄色av网站| 91亚洲va在线va天堂va国| 日韩电视剧免费观看网站| 欧美黄色免费网站| 国产精品wwww| 日韩hd视频在线观看| www.久久久久久.com| 国产成人综合精品在线| 欧美一级片久久久久久久| 91国语精品自产拍在线观看性色| 亚洲精选中文字幕| 欧美视频精品一区| 国内精品一区二区三区四区| 欧美专区在线观看| 欧美精品性视频| 国产精品video| 中文字幕日韩精品有码视频| 久久偷看各类女兵18女厕嘘嘘| 日韩av在线不卡| 欧美—级高清免费播放| 国产午夜精品全部视频播放| 国产一区二区动漫| 97在线看免费观看视频在线观看| 日韩成人中文字幕在线观看| 亚洲韩国欧洲国产日产av| 亚洲欧美综合精品久久成人| 国产丝袜一区二区| 欧美激情啊啊啊| 亚洲精品之草原avav久久| 中文字幕av日韩| 久久精品中文字幕电影| 日韩av在线网页| 日韩乱码在线视频| 欧美在线免费看| 欧美精品video| 国产成人短视频| 最近2019中文字幕一页二页| 国产精品久久久久久久久久新婚| 日韩中文字幕在线视频播放| 日韩高清有码在线| 久久夜色精品国产亚洲aⅴ| 色黄久久久久久| 亚洲毛片在线观看| 精品二区三区线观看| 亚洲老板91色精品久久| 一本色道久久综合狠狠躁篇怎么玩| 久久免费在线观看| 欧美国产日韩一区二区三区| 久久久国产视频| 欧美日韩国产一区二区三区| 亚洲欧美国产精品久久久久久久| 国产99久久精品一区二区永久免费| 国产一区二区视频在线观看| 日日噜噜噜夜夜爽亚洲精品| 国产精品久久久久免费a∨大胸| 国产有码一区二区| 欧美日韩国产一区二区三区| 欧美华人在线视频| 国产日韩欧美在线视频观看| 69视频在线免费观看| 日韩视频在线免费观看| 日韩免费观看高清| 日韩欧美在线播放| 亚洲精品久久在线| 久青草国产97香蕉在线视频| 97精品伊人久久久大香线蕉| 亚洲日本欧美日韩高观看| 日本免费一区二区三区视频观看| 92看片淫黄大片欧美看国产片| 久久精品国产v日韩v亚洲| 久久久久九九九九| 992tv在线成人免费观看| 日本三级久久久| 狠狠色狠狠色综合日日小说| 日本免费一区二区三区视频观看| 国产精品久久久亚洲| 欧美日韩在线视频一区二区| 国产女同一区二区| 欧美成人亚洲成人日韩成人| 最近2019中文字幕一页二页| 国产视频精品xxxx| 97在线免费观看视频| 久久青草精品视频免费观看| 久久久久亚洲精品成人网小说| 国产精品久久久久一区二区| 欧美成人精品在线播放| 在线免费观看羞羞视频一区二区| 91色在线视频| 热门国产精品亚洲第一区在线| 日韩av电影在线播放| 91精品久久久久久久久中文字幕| 久久久久久国产精品久久| 国产精品久在线观看| 亚洲国产精品资源| 97国产精品视频人人做人人爱| 亚洲欧美日韩精品久久奇米色影视| 国产成人拍精品视频午夜网站| 欧美在线免费看| 情事1991在线| 精品偷拍一区二区三区在线看| 国产精品一区二区三区久久| 亚洲二区中文字幕| 久久久精品在线观看| 日韩av网站大全| 国精产品一区一区三区有限在线| 精品国产福利视频| 欧美午夜视频在线观看|