Nginxタイマー

WBOY
WBOYオリジナル
2016-08-08 09:19:321457ブラウズ

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_init(void); キャッシュされている時間変数を初期化する現在のプロセス
void ngx_time_update(void) gettimeofday呼び出しを使用して、キャッシュされた時間をシステム時間で更新します
u_char *ngx_http_time(u_char *buf,time_t t) tは変換する必要がある時間です(グリニッジより)時間) 秒)、buf は HTTP 時間に変換された後に文字列を保存するために使用されるメモリです t を「Mon,28 Sep 1970 06:00:00 GMT」の形式に変換します
u_char *ngx_http_cookie_time(u_char) *buf, time_t t) 上記と同じ tは変換する必要がある時間(グリニッジ標準時からの秒数)、bufはHTTP時間に変換した後に文字列を保存するために使用されるメモリです
void ngx_gmtime (time_t t,ngx_tm_t *tp t に ngx_tm_t を入力します
time_t ngx_next_time(time_t when) when は、有効期限が切れる予定の時間を表し、1 日の秒数のみを表します 失敗が返される - 1; それ以外の場合は次を返します。 1. マージされた場合、現在時刻に達してもタイムアウトしない場合は、秒数をグリニッジ標準時に返します。 2. タイムアウトになる場合は、秒数をグリニッジ標準時に返します。翌日の同時刻の時刻
define ngx_time() ngx_cache_time->sec グリニッジ標準時から現在時刻までの秒数を取得
define ngx_timeofday() (ngx_time_t *) ngx_cached_time キャッシュされたngx_time_t型の時間を取得します

タイマーの実装

タイマーの構造は、すべてのタイマーで構成される赤黒ツリーであり、ngx_event_timer_sentinelは番兵この赤黒ツリーのキーはイベントのタイムアウトです。したがって、タイムアウトする可能性が最も高いイベントは

です。 関数名ngx_int_t ngx_event_timer_init(ngx_log_t * log); ngx _msec_t ngx_event_find_timer(void);void ngx_event_expire_timers(void);static ngx_inline void ngx_event_del_timer(ngx_event_t *ev); static ngx_inline void ngx_event_add_time(ngx_event_t *ev,ngx_msec_t timer)
パラメータの意味 実行の意味
ログオブジェクト 初期化タイマー
ノードを見つける赤黒ツリーの左下隅にある値が現在時間より大きい場合は、準備ができているイベントがないことを意味し、それ以外の場合は、イベントの準備ができていることを示す 0 を返します。
赤黒ツリー内のすべてのイベントを確認し、準備ができているすべてのイベントのハンドラー コールバック関数を呼び出します
エフは操作する必要があるイベントです タイマーからイベントを削除します
タイマーの単位はミリ秒であり、タイマーイベント ev がタイマーミリ秒後にタイムアウトを望んでいることを伝えます タイムアウトがミリ秒のタイマーイベントを追加します
著作権表示: 痛みはあなたの心の中にだけあります

以上、Nginx タイマーをその側面も含めて紹介しましたが、PHP チュートリアルに興味のある友人に役立つことを願っています。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。