新聞中心
這篇文章主要為大家展示了“Nginx+lua如何實現(xiàn)調(diào)用.so文件”,內(nèi)容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Nginx+lua如何實現(xiàn)調(diào)用.so文件”這篇文章吧。
最近在和智能硬件部門一起,做一個室內(nèi)定位的服務(wù),該服務(wù)根據(jù)手機端傳過來的beacon設(shè)備列表,根據(jù)一定的算法計算出具體的商場,并將商場ID和beason設(shè)備列表作為參數(shù),調(diào)用.so文件中的計算方法,得出位置數(shù)據(jù)(坐標:x、y、z),返回給手機端。
因為服務(wù)對QPS要求比較高,并且都是純查詢操作,于是決定使用Nginx+lua+Redis的架構(gòu)(該架構(gòu)在公司內(nèi)部已成主流,比較成熟)。下面我將對lua調(diào)用.so文件的方式,做一下介紹。
lua調(diào)用.so文件,主要有兩種方式:
1.Lua直接調(diào)用動態(tài)鏈接庫,具體可參考 技術(shù)分享 。
2.使用C寫一個Wrapper。
鑒于第一種方式需要引入第三方工具包,并且效率不高,所以我們采用第二種方式來實現(xiàn)。具體實現(xiàn)過程如下:
1.編寫業(yè)務(wù)代碼,其中包括業(yè)務(wù)方法的封裝器。
static int lua_Locate( lua_State* L ) { long handle = lua_tonumber( L, 1 ); const char* beacon_rssi_json = lua_tostring( L, 2 ); vector
其中,wapper函數(shù)的函數(shù)名有個命名規(guī)則,前綴為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”, 否則導(dǎo)出的函數(shù)會被重命名,切記切記! 關(guān)于extern “C”,請參考 extern “C” 用法解析。
2.Nginx配置文件中指定so包所在的文件夾。
lua_package_cpath ‘/var/wdd/wrs/webroot/intelligent_lua/?.so;;’;
注意,這里有很多種配置方式,只要讓lua能找到so文件即可,比如可以通過lua代碼package.cpath來引入(參閱下面代碼段)或者直接把so文件復(fù)制lua環(huán)境變量指定的目錄里等。
package.cpath = ‘/usr/local/lib/lua/5.1/?.so;’ --搜索so模塊
如果未指定cpath或者cpath中找不到so文件,系統(tǒng)會報如下異常:
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’
以上是“Nginx+lua如何實現(xiàn)調(diào)用.so文件”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對大家有所幫助,如果還想學(xué)習(xí)更多知識,歡迎關(guān)注創(chuàng)新互聯(lián)-成都網(wǎng)站建設(shè)公司行業(yè)資訊頻道!
網(wǎng)站名稱:Nginx+lua如何實現(xiàn)調(diào)用.so文件-創(chuàng)新互聯(lián)
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/coheid.html