Nginx 定時器
Nginx 對時間的管理
Nginx為了提高速度,自己實現了對時間的管理,設計了資料結構和一些變量,儲存在記憶體中。每一個行程都會單獨地管理目前的時間。
ngx_time_t
<code><span>typedef</span><span>struct</span> { <span>//格林威治时间1970年1月1日凌晨0点0分0秒到当前时间的秒数</span> time_t sec; <span>//sec成员只能精确到秒,msec则是当前时间相对sec的毫秒偏移量</span> ngx_uint_t msec; <span>//时区</span> ngx_int_t gmtoff; } ngx_time_t;</code>
ngx_tm_t
<code><span>struct</span> tm { <span>int</span> tm_sec; <span>/* 秒–取值区间为[0,59] */</span><span>int</span> tm_min; <span>/* 分 - 取值区间为[0,59] */</span><span>int</span> tm_hour; <span>/* 时 - 取值区间为[0,23] */</span><span>int</span> tm_mday; <span>/* 一个月中的日期 - 取值区间为[1,31] */</span><span>int</span> tm_mon; <span>/* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */</span><span>int</span> tm_year; <span>/* 年份,其值从1900开始 */</span><span>int</span> tm_wday; <span>/* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */</span><span>int</span> tm_yday; <span>/* 从每年的1月1日开始的天数 - 取值区间为[0,365],其中0代表1月1日,1代表1月2日,一次类推 */</span><span>int</span> tm_isdst; <span>/* 夏令时标识符。在实行夏令时的时候,tm_isdst为正;不实行夏令时的时候tm_isdst为0;否则为负 */</span> }; typedef <span>struct</span> tm ngx_tm_t; <span>#<span>define</span> ngx_tm_sec tm_sec</span><span>#<span>define</span> ngx_tm_min tm_min</span><span>#<span>define</span> ngx_tm_hour tm_hour</span><span>#<span>define</span> ngx_tm_mday tm_mday</span><span>#<span>define</span> ngx_tm_mon tm_mon</span><span>#<span>define</span> ngx_tm_year tm_year</span><span>#<span>define</span> ngx_tm_wday tm_wday</span><span>#<span>define</span> ngx_tm_isdst tm_isdst</span></code>
從上面的定義可以看出,ngx_tm_t和struct tm結構是一模一樣的。
Nginx快取時間的操作函數
函數名稱 | 參數意義 | 執行意義 |
---|---|---|
void ngx_time_update(void) | 使用gettimeofday呼叫以系統時間更新快取的時間 | |
u_char *ngx_http_time(u_charbufhf,time)秒數),buf是轉換為HTTP時間後用來存放字串的記憶體 | 將t轉換為「Mon,28 Sep 1970 06:00:00 GMT」形式 | |
同上 | t是需要轉換的時間(距離格林威治時間的秒數),buf是轉換為HTTP時間後用來存放字串的記憶體 | _ |
將t填充ngx_tm_t | ||
when表示期待過期的時間,僅表示一天內秒數到當前時間後並未超時,那麼返回這個到格林威治時間的秒數;2、如果超時,那麼返回次日同一刻間到格林威治時間的秒數 | define ngx_time() ngx_cache_time- >sec | |
取得格林威治時間到目前時間的秒數 | define ngx_timeofday() (ngx_time_t *)ngx_cached_time | |
計時器的結構是一棵紅黑樹。 ,最左下角的節點就是最有可能超時的事件。 ); | 日誌物件 | 初始化定時器 |
ngx_msec_t ngx_event_find_timer(void); | 紅黑樹最左下角的節點,如果它比當前時間的大緒超時時間”;否則返回0,表示已經有事件準備就緒 |
void ngx_event_expire_timers(void);
檢查紅黑樹中的所有事件,調用所有準備就緒事件的handler回調函數
ev是需要操作的事件 | 從定時器中刪除一個事件 | |
---|---|---|
添加定時器事件,超時時間為timer毫秒 | ||
以上就介紹了Nginx 定時器,包含了方面的內容,希望對PHP教學有興趣的朋友有幫助。 |