變數可以認為是存放「值」的容器。而所謂「值」,在許多程式語言裡,既可以是3.14
這樣的數值,也可以是hello world
這樣的字串,甚至可以是像陣列、雜湊表這樣的複雜資料結構。
nginx 的變數和 perl、php 等語言的類似,由美元符號 $ 開頭,隨後跟著乙個字串,代表這個變數的名稱,例如$name
,可選地,這個字串可以用花括號包圍,譬如$
,合法的變數名可用字符集為 [a-za-z0-9_]。特別地,nginx 支援正則子組,即 $1,$2 這樣的變數。變數值只有字串這一種型別。
例子:nginx.conf
檔案中有以下配置:
使用server
}
curl
這個 http 客戶端在命令列上請求這個/test
介面,可以得到:
foo: hello我們通過 set 配置指令對變數$foo
進行了賦值操作, 把字串hello
賦給了它,通過「變數插值」的形式將其拼接到字串中。
1、主要資料結構
1)變數跟蹤結構體
維護 nginx 各模組支援的和配置檔案中用到的變數資訊結構體。
typedef struct ngx_http_core_main_conf_t;
variables_keys
只是在解析時使用的臨時儲存,配置解析完成後,其中的變數資訊會被ngx_http_variables_init_vars
轉存到variables
和variables_hash
中。
不難知道變數擁有兩種存放方式,第一種是儲存在乙個全域性的 hash 表裡(variables_hash);第二種則是儲存在乙個全域性動態陣列裡(variables),每個變數存在乙個對應的索引。
2)變數資訊結構體
儲存變數屬性、變數set_handler
和get_handler
和這兩個函式用到的引數值。
struct ngx_http_variable_s ;
變數的屬性是以下幾種屬性的單例或組合:
變數可被覆蓋
不可快取,對於 noncacheable 的變數,每次取值時都需要呼叫其get_handler
儲存在動態陣列中
不儲存在 hash 表中
字首型變數,如arg_
和cookie_
示例:
3)變數值結構體static ngx_http_variable_t ngx_http_fastcgi_vars = ,
};
typedef struct ngx_variable_value_t;
4)變數獲取介面2、變數分類/* 獲取沒有索引的變數 */
/* 根據索引獲取變數,對於 nocaheable 變數會重新獲取 */
/* 根據索引獲取變數 */
ngx_http_variable_value_t *ngx_http_get_indexed_variable(ngx_http_request_t *r, ngx_uint_t index);
1)核心模組ngx_http_core_module
提供的(內建)變數
使用ngx_http_core_variables
描述, 由preconfiguration
**函式ngx_http_variables_add_core_vars
進行定義:
...}2)其他功能模組中新增的變數
如ngx_http_fastcgi_module
提供的變數使用ngx_http_fastcgi_vars
描述,由preconfiguration
**函式ngx_http_fastcgi_add_variables
進行定義:
}3)使用set
建立的變數
由ngx_http_rewrite_module
提供的set
指令定義的自定義變數由其配置解析函式ngx_http_rewrite_set
進行定義:
上述三種型別變數資訊都被直接 (ngx_hash_add_key
) 或間接 (ngx_http_add_variable
) 儲存到了variables_keys
中。
聊一聊C語言變數
我們知道每乙個程式的執行都需要記憶體,那麼c語言的變數的定義是什麼含義呢?假如我花了200元買了一塊4g記憶體條,然後我定義了乙個inta 就意味著從這4g的記憶體上要拿走4個位元組,又定義了乙個intb 那麼b同樣也要從4g的記憶體條上拿走4位元組。這就是c語言變數的一般含義,每乙個變數實質上都會...
聊一聊js的變數提公升
今天做了變數提公升的題目,發現自己還是一知半解的狀態,以後搞清楚乙個技術點就寫下來記錄一下,儘管自己可能也不知道怎麼表達的會讓大家看的懂,就先慢慢的一步步前進吧,寫多了總比不寫好呀。function getclothing iscold else a.referenceerror freezing ...
聊一聊小甜餅
cookies程式設計 cookie是儲存在客戶端的小文字,儲存的位置分為兩種 cookie可能儲存在客戶端瀏覽器的所佔記憶體中,關閉瀏覽器後,cookies就不再存在。cookie也可能儲存在客戶pc機的硬碟上,設定有效時間,超過有效時間後失效。cookie的常見應用 簡化登入 很多 在登入時,可...