国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 網站 > Nginx > 正文

Nginx+lua 實現調用.so文件

2024-08-30 12:23:09
字體:
來源:轉載
供稿:網友
本文給大家分享的是Nginx結合lua 實現調用.so動態鏈接庫文件的方法和示例,有需要的小伙伴可以參考下

最近在和智能硬件部門一起,做一個室內定位的服務,該服務根據手機端傳過來的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'
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 正蓝旗| 梅河口市| 高要市| 北流市| 永登县| 浦东新区| 汾阳市| 灵石县| 陕西省| 新蔡县| 普安县| 都江堰市| 万州区| 富民县| 峨眉山市| 攀枝花市| 新建县| 额济纳旗| 孙吴县| 广饶县| 长泰县| 高台县| 台江县| 荣成市| 莱芜市| 龙里县| 昌平区| 四平市| 白银市| 舞阳县| 会泽县| 阳东县| 普格县| 九龙坡区| 万年县| 遂昌县| 重庆市| 读书| 华安县| 城口县| 会理县|