openresty package path

openresty lua_package_path 是整個openresty最基礎的功能,不理解
path就無法做項目,更無法寫框架。

先看下文檔lua_package_path

https://github.com/openresty/lua-nginx-module#lua_package_path
Sets the Lua module search path used by scripts specified by set_by_lua, content_by_lua and others. The path string is in standard Lua path form, and ;; can be used to stand for the original search paths.
設置由set_by_lua,content_by_lua等指定的腳本使用的Lua C模塊搜索路徑。 cpath字符串採用標準的Lua cpath格式,並且;; 可以用來代表原始的cpath。
相當於PHP的include_path,告訴應用加載程序的時候在哪個目錄加載。;; 相當於系統或者框架的路徑

lua_package_path的幾種用法

設置path將項目框架代碼加進lua_package_path

lua_package_path '/data/www/framework/?.lua;;';
表示將 /data/www/framework/ 加進lua的require搜索目錄裏面。加入我寫了一個utils.lua 放到/data/www/framework/裏面,使用的時候只需要
local utils = require "utils"
發現每個lua_package_path都是;;結尾的,主要是;;表示原始的path路徑,如果沒有;; resty 的原生的框架代碼就無法 require 進來。
這樣的話,問題就來了,如果我服務器上有ABCDEF等很多的項目,那我豈不是得
lua_package_path '/data/www/A/?.lua;/data/www/B/?.lua;/data/www/C/?.lua;/data/www/D/?.lua;;'這樣很多個項目。而且不同的項目相同的文件名怎麼處理,豈不是亂了。確實會有這個問題。所以說下我們第二個方法

將整個服務目錄都加進require搜索目錄,使用的時候用項目名稱區分

lua_package_path '/?.lua;;‘
A項目的conf配置裏面加上項目名稱
set $app_root '/data/www/test_test_com/';
使用的時候require app_root . "application.controller.testController"
這樣就很容易解決多項目衝突的問題。

package.path 的使用

如果只是想暫時的修改搜索路徑,或者研發測試的有時候想用prod的代碼有事想用dev的代碼。那麼可以使用package.path變量
package.path = package.path .. ";/?.lua;/data/test/?.lua;;"
看到有的框架也這麼使用。臨時這麼使用沒問題。如果生產的也都這麼使用有問題的,試想下每個請求都做一次該操作,會導致package.path這個變量越來越大,佔用的內存越來越多,影響服務器內存指標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章