Heim > Artikel > Backend-Entwicklung > Nginx-Timer
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.