Nginx 타이머

WBOY
WBOY원래의
2016-08-08 09:19:321459검색

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

타이머 구현

타이머의 구조는 레드-블랙 트리입니다. ngx_event_timer_rbtree는 모든 타이머로 구성된 레드-블랙 트리이고, ngx_event_timer_sentinel은 이 레드-블랙 트리의 센티널 노드입니다. 이 레드-블랙 트리는 이벤트의 타임아웃 시간으로 키워드를 사용하므로 왼쪽 하단에 있는 노드가 타임아웃될 가능성이 가장 높은 이벤트입니다.

타이머 작동 기능

函数名 参数含义 执行意义
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毫秒

저작권: 고통은 마음속에만 있습니다.

위 내용은 Nginx 타이머의 측면을 포함하여 소개되었으며, PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.