nginx中的處理乙個http的請求分為了8個phase,分別是下面幾個階段.
其中特別要注意就是幾個rewrite階段。
這裡要注意的就是這幾個phase的執行是嚴格按照順序的,也就是ngx_http_post_read_phase是第乙個,而log_phase是最後乙個。只有乙個特殊那就是find_config_phase,這個的話,有可能會在後面的rewrite phase再來呼叫這個phase。
這裡handler的結構是這樣的,在ngx_http_core_main_conf_t中會有乙個包含了ngx_http_phase_t結構的陣列,而ngx_http_phase_t包含了乙個動態陣列,也就是說每乙個phase都有乙個handler陣列。
然後每個handler陣列的元素都是乙個hanler函式。
也就是我們寫handler的時候註冊的handler函式。
ok,接下來我們來看phase的初始化,初始化函式是ngx_http_init_phase_handlers。
在看phase初始化之前,我們先來看乙個叫做ngx_http_phase_handler_s的結構體,這個結構體是儲存在ngx_http_core_main_conf_t 中的,最終我們通過上面所講的phases註冊的handler鏈會被轉換為ngx_http_phase_handler_s,然後儲存在ngx_http_core_main_conf_t的phase_engine中。而後面對handler的呼叫處理都是使用ngx_http_phase_handler_s。
這個結構體是每個handler都會有乙個的,也就是說所有的phase handler最終都會鏈結到乙個大的陣列中,這個大陣列就是ngx_http_phase_engine_t的handlers域。
然後我們來看它的每個域的含義。
checker 所有處於相同phase的handler的check都是相同的,每個phase的handler的呼叫都是在check中的,也就是check進行一些校驗,結果判斷等等操作。
handler就是對應的handler處理函式
ngxt 表示了下乙個要執行的handler(也就是ngx_http_phase_handler_s)的位置,由於是陣列,所以這個也就表示陣列索引。而這個預設就是下乙個將要執行的phase
來看函式的實現,其實功能很簡單,就是初始化ngx_http_phase_handler_s,將我們註冊的handler都鏈結到這個陣列中,然後還有一些校驗等。
這裡要注意有些phase的話只會有乙個handler,比如config_phase,下面的**中我們會詳細看到。
//陣列分配記憶體
//handler陣列放到handlers裡面。
cmcf->phase_engine.handlers = ph;
//n表示下乙個phase的索引。
n = 0;
//開始遍歷phase handler.這裡是乙個phase乙個phase的遍歷。
//賦值checker
//config phase只有乙個.這裡設定 find_config_index,是因為當我們rewrite之後的url就必須重新掛載location的一些結構,因此就需要再次進入這個phase
//自己的checker
//共用的checker
//如果有使用rewrite則給它的checker賦值
}//這裡n剛好就是下乙個phase的其實索引
n += cmcf->phases[i].handlers.nelts;
//開始遍歷當前的phase的handler。
for (j = cmcf->phases[i].handlers.nelts - 1; j >=0; j--)
}return ngx_ok;
}
這裡需要注意就是只有下面這幾個phase會有多個handler,剩餘的都是只有乙個handler的。
接下來我們來看phase的啟動。
phase的啟動是在ngx_http_core_run_phases這個函式中的,這個函式會遍歷所有phase然後呼叫他們的checker來進行處理,也就是說錯誤,返回**的控制什麼的都是由各自的checker做的。而所有的checker的返回值都是一樣的。
nginx 編寫簡單handler模組
1 安裝依賴庫 安裝gcc g 的依賴庫 apt get install build essential apt get install libtool 安裝pcre依賴庫 sudo apt get install libpcre3 libpcre3 dev 安裝zlib依賴庫 apt get in...
android中Handler的用法
寫了乙個demo,如下 public class mainactivity extends activity endbutton.setonclicklistener new onclicklistener 建立handler物件 handler handler new handler runnab...
android中的Handler機制
一 為什麼要用handler 之所以需要跨執行緒通訊是因為在 android 中主線程通常只負責 ui 的建立和修改,子執行緒負責網路訪問和耗時操作,因此,主線程和子執行緒需要經常配合使用才能完成整個 android 功能,這時候就有了handler的出現。二 什麼是handler 訊息佇列,先進後...