Heim  >  Artikel  >  Backend-Entwicklung  >  Nginx-Timer

Nginx-Timer

WBOY
WBOYOriginal
2016-08-08 09:19:321435Durchsuche

Nginx-Timer

Nginx-Zeitmanagement

Um die Geschwindigkeit zu verbessern, implementiert Nginx selbst das Zeitmanagement, entwirft Datenstrukturen und einige Variablen und speichert sie im mittleren Speicher. Jeder Prozess verwaltet die aktuelle Zeit selbstständig.

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>

Aus der obigen Definition ist ersichtlich, dass die Strukturen ngx_tm_t und struct tm genau gleich sind.

Nginx-Cache-Zeitbetriebsfunktion

函数名 参数含义 执行意义
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、如果when合并到当前时间后并未超时,那么返回这个到格林威治时间的秒数;2、如果超时,那么返回次日同一刻间到格林威治时间的秒数
define ngx_time() ngx_cache_time->sec 获取格林威治时间到当前时间的秒数
define ngx_timeofday() (ngx_time_t *)ngx_cached_time 获取缓存的ngx_time_t类型时间

Timer-Implementierung

Die Struktur des Timers ist ein rot-schwarzer Baum. ngx_event_timer_rbtree ist ein rot-schwarzer Baum, der aus allen Timern besteht, und ngx_event_timer_sentinel ist der Sentinel-Knoten dieses rot-schwarzen Baums. Dieser rot-schwarze Baum verwendet das Schlüsselwort als Timeout-Zeit des Ereignisses, sodass der Knoten in der unteren linken Ecke das Ereignis ist, bei dem am wahrscheinlichsten ein Timeout auftritt.

Timer-Betriebsfunktion

函数名 参数含义 执行意义
ngx_int_t ngx_event_timer_init(ngx_log_t *log); 日志对象 初始化定时器
ngx_msec_t ngx_event_find_timer(void); 找出红黑树最左下角的节点,如果它比当前时间大,说明没有准备就绪的事件,返回距离“超时时间”;否则返回0,表示已经有事件准备就绪
void ngx_event_expire_timers(void); 检查红黑树中的所有事件,调用所有准备就绪事件的handler回调函数
static ngx_inline void ngx_event_del_timer(ngx_event_t *ev); ev是需要操作的事件 从定时器中删除一个事件
static ngx_inline void ngx_event_add_time(ngx_event_t *ev,ngx_msec_t timer) timer单位是毫秒,它告诉定时器事件ev希望timer毫秒后超时 添加一个定时器事件,超时时间为timer毫秒

Urheberrechtserklärung: Schmerz ist nur in deinem Kopf.

Das Obige hat den Nginx-Timer vorgestellt, einschließlich seiner Aspekte. Ich hoffe, dass er Freunden, die sich für PHP-Tutorials interessieren, hilfreich sein wird.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn