這一部分我們將**一些較細節的東西,加上前面(一),(二)兩篇文章對典型情景的分析,我相信應該會對大家理解nginx的指令碼解析機制有很大的幫助的。
這裡我們關注ngx_http_core_main_conf_t(下面簡寫為cmcf)結構中的這兩個成員,cmcf->variables_keys和cmcf->variables,其中variables_keys是個hash陣列,變數hash值相同的放到乙個陣列中,而且是唯一的,重複時會報錯。重要的是這個hash陣列,即cmcf->variables_keys,儲存了整個系統中所有預定義的,自定義,幾乎所有的變數(一些特定字首的變數除外,如「http_」等,在函式ngx_http_variables_init_vars中都列出來了)。
我們分條目來看:
1. 系統中所有可能用到變數都會放到cmcf->variables_keys中。
2.配置中出現的變數(在處理請求時會用到的),會放到cmcf->variables中。總體上來看,除去一些有特定字首的變數(這類變數後面會講),cmcf->variables可以看做是ngx_http_variables_init_vars的子集。從這裡的設計可以看出來,系統定義的變數在請求處理時,並不會全部用到,我們只需根據配置,拿到有用的就可以了,所以cmcf->variables_keys使用了temp_pool(實際的元素則使用cf->pool),當variables收集變數完成之後,variables_keys結構也就沒什麼用處了。
3. cmcf->variables是乙個陣列,它的元素型別為ngx_http_variable_t。
4. 在init_request階段,我們看到有這樣的處理:
這裡的設計思想是這樣的,cmcf->variables是每個變數的處理資訊的封裝,而r-> variables裡面則是處理該變數得到的內容(即value),所以cmcf->variables跟r->variables是一一對應的,成員之間就是var對value的關係,這不過這裡的var和value是封裝了很多資訊的結構,不是單純的值或字串。這裡我們看下r->variables的成員。
typedef struct ngx_variable_value_t;
我們看到這個結構中處理包含代表直接變數值的指標和大小(即data和len)外,剩下的都是一些標記位。
下面我們看幾個巨集:
使用這個巨集的時候意味著,該變數可以重複配置,一般後配置的會覆蓋前面的配置。如:
set $file $1
set $file $2
那麼結果就是file的最終值就是$2所代表的。
這個巨集所影響的正是ngx_variable_value_t結構中的no_cacheable,前面注釋裡面提到過,凡是有該標記的變數,都要通過get_handler來獲取變數的值。如下面函式:
// 這是乙個ngx_http_var_nocacheable型別的變數,那麼…
v->valid = 0;
v->not_found = 0;
}// 重新獲取,這個函式就不看了,大家可以自己分析
這種變數往往是跟特定的請求緊密相關的,如host,uri,args之類的,處理時每次重新獲取新值時必要的。
3. ngx_http_var_indexed和ngx_http_var_nohash
這兩個巨集主要是在ssi相關處理中用到,而ssi的處理需要用到cmcf->variables_hash,這是hash表,可以高效的找到變數。ngx_http_var_nohash型別的變數壓根就不會被放到這個hash表中,而從hash表中找到的變數,是ngx_http_variable_t結構,如果我們從它flags發現ngx_http_var_indexed標記,那麼意味著我們可以直接到r->variables中去找,至於找到後可用與否,那要另作判斷了!
nginx指令碼引擎與變數設計 二
location 一 set行的解析 1.我們首先看這裡這句 為什麼這個函式的第三個引數flag,被設定成ngx http var changeable,那是因為set之後的第乙個的變數可以在乙個if配置裡面出現多次,每次可以改變它的值,當然還有nochangeable的,後面碰到再說。緊接著,把這...
面板引擎設計
引擎設計 引擎設計思路 其實也就是hook掉預設的視窗繪製,然後根據視窗類別,用自己的視窗渲染代替了windows預設的視窗渲染。這個過程非常繁瑣,特別考驗耐心和體力。花了乙個上午,總算把button做好了,下一步是把這個button應用到公司的客戶端上,效果不錯。button的demo圖 設計思路...
引擎學習之二 設計引擎
1 建立動態和靜態鏈結庫 lib hinstance loadlibrary lpctstr plibfilename zfxrenderer.cpp zfxrenderer.h 建立,得到,釋放 zfxrenderdevice.h 用於定義介面 確保載入到記憶體中的dll只載入一次,如果另乙個應用...