關於Lua模組進行Web開發常見問題集是本文要介紹的內容,主要是通過LUA web開發中所提出的問題,邊解決邊學習,具體內容來看本文詳解。
如何擷取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 模組才能從該變數得到請求體,否則該變數內容始終為空白!)。如果想擷取 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介面,近期即會予以實現。
如何使用 Lua 外部模組
通過 require 引用即可,和在普通的 Lua 代碼裡一樣。需要注意的一點是,通過 require 引用外部模組一般有 2 種寫法。老的寫法是:
Lua代碼
- require("xxx")
- require("xxx")
這樣會將模組命名空間表直接匯入當前全域環境內;而新的寫法是:
Lua代碼
- local xxx = require("xxx")
- local xxx = require("xxx")
這樣的寫法將模組命名空間表緩衝在同名局部變數中,訪問更快,也不會汙染當前全域環境。但最重要的一點是:老的寫法在 ngx_lua 中會出現模組匯入後無法訪問的現象!這是由 ngx_lua 實現原理決定的。
ngx_lua 使用每請求一個 coroutine 的方式運行使用者代碼,coroutine 的全域環境是重新關聯的,因此使用者代碼相當於運行在一個沙箱中,請求處理結束後使用者代碼產生的所有全域環境修改都會被捨棄,避免多個請求之間產生交叉影響,也降低了因濫用全域環境產生記憶體流失的風險。而 require 利用了全域共用的 package.loaded 表緩衝已載入模組的資料,以達到避免重複載入模組的目的。很明顯,這種結構必然會使首個請求中通過 require 注入全域環境的模組命名空間表在後續請求中無法訪問,因為後續請求中 package.loaded 表內已經有之前載入模組的資料,故 require 不會再次將命名空間表注入當前全域環境,使得以後所有依賴於模組的操作都失敗。
鑒於這一問題,我們推薦web開發人員總是使用新的 require 寫法即使用局部變數緩衝模組表),對於那些因為某種原因無法更新 require 寫法的代碼,可以通過在開始處理請求前清空 package.loaded 表中對應模組資料的方式強制載入模組並注入全域環境注意每次都載入模組可能產生效能瓶頸!),例如:
Lua代碼
- package.loaded.xxx = nil
- require("xxx")
小結:關於Lua模組進行Web開發常見問題集的內容介紹完了,希望通過本文的學習能對你有所協助!