關于Lua模塊進行Web開發(fā)常見問題解答
關于Lua模塊進行Web開發(fā)常見問題解答是本文要介紹的內容,主要是通過LUA web開發(fā)中所提出的問題,邊解決邊學習,具體內容來看本文詳解。
如何獲取HTTP請求頭
直接在 ngx_lua 中訪問 NginX 內置變量 ngx.var.http_HEADER 即可獲得請求頭 HEADER 的內容。對于常見的特殊頭(Content-Type、Cookie 等),NginX 還使用了特殊的變量來獨立保存,例如“Content-Type”頭可以通過 ngx.var.content_type 變量取得。
如何獲取GET參數
在 ngx_lua 中訪問 NginX 內置變量 ngx.var.arg_PARAMETER 即可獲得GET參數PARAMETER的內容。
如何獲取POST請求體數據
要獲得完整的POST請求體數據,可以訪問 NginX 內置變量 ngx.var.request_body(注意:由于 NginX 默認在處理請求前不自動讀取 request body,所以目前必須顯式借助 form-input-nginx 模塊才能從該變量得到請求體,否則該變量內容始終為空?。H绻氆@取 POST 方式提交的表單參數,還可以借助 form-input-nginx 模塊省去解析過程。例如:
Nginx代碼
- location /form {
- set_form_input $name;
- content_by_lua '
- local name = ngx.var.name or "";
- local say = ngx.say
- say("My name is: ", name)
- ';
- }
- location /form {
- set_form_input $name;
- content_by_lua '
- local name = ngx.var.name or "";
- local say = ngx.say
- say("My name is: ", name)
- ';
- }
如何設置/獲取HTTP響應頭
我們已經設計了對應的API接口,近期即會予以實現(xiàn)。
如何使用 Lua 外部模塊
通過 require 引用即可,和在普通的 Lua 代碼里一樣。需要注意的一點是,通過 require 引用外部模塊一般有 2 種寫法。老的寫法是:
Lua代碼
- require("xxx")
- require("xxx")
這樣會將模塊命名空間表直接導入當前全局環(huán)境內;而新的寫法是:
Lua代碼
- local xxx = require("xxx")
- local xxx = require("xxx")
這樣的寫法將模塊命名空間表緩存在同名局部變量中,訪問更快,也不會污染當前全局環(huán)境。但最重要的一點是:老的寫法在 ngx_lua 中會出現(xiàn)模塊導入后無法訪問的現(xiàn)象!這是由 ngx_lua 實現(xiàn)原理決定的。
ngx_lua 使用每請求一個 coroutine 的方式運行用戶代碼,coroutine 的全局環(huán)境是重新關聯(lián)的,因此用戶代碼相當于運行在一個沙盒中,請求處理結束后用戶代碼產生的所有全局環(huán)境修改都會被舍棄,避免多個請求之間產生交叉影響,也降低了因濫用全局環(huán)境產生內存泄漏的風險。而 require 利用了全局共享的 package.loaded 表緩存已載入模塊的數據,以達到避免重復加載模塊的目的。很明顯,這種結構必然會使首個請求中通過 require 注入全局環(huán)境的模塊命名空間表在后續(xù)請求中無法訪問,因為后續(xù)請求中 package.loaded 表內已經有之前加載模塊的數據,故 require 不會再次將命名空間表注入當前全局環(huán)境,使得以后所有依賴于模塊的操作都失敗。
鑒于這一問題,我們推薦web開發(fā)人員總是使用新的 require 寫法(即使用局部變量緩存模塊表),對于那些因為某種原因無法更新 require 寫法的代碼,可以通過在開始處理請求前清空 package.loaded 表中對應模塊數據的方式強制加載模塊并注入全局環(huán)境(注意每次都加載模塊可能產生性能瓶頸?。?,例如:
Lua代碼
- package.loaded.xxx = nil
- require("xxx")
小結:關于Lua模塊進行Web開發(fā)常見問題解答的內容介紹完了,希望通過本文的學習能對你有所幫助!