当前位置:Gxlcms > PHP教程 > Nginx定时器

Nginx定时器

时间:2021-07-01 10:21:17 帮助过:116人阅读

Nginx 定时器

Nginx 对时间的管理

Nginx为了提高速度,自己实现了对时间的管理,设计了数据结构和一些变量,存储在内存中。每一个进程都会单独地管理当前的时间。

ngx_time_t

typedefstruct {
    //格林威治时间1970年1月1日凌晨0点0分0秒到当前时间的秒数
    time_t          sec;

    //sec成员只能精确到秒,msec则是当前时间相对sec的毫秒偏移量
    ngx_uint_t  msec;

    //时区
    ngx_int_t       gmtoff;
}   ngx_time_t;

ngx_tm_t

struct tm {
    int tm_sec; /* 秒–取值区间为[0,59] */int tm_min; /* 分 - 取值区间为[0,59] */int tm_hour; /* 时 - 取值区间为[0,23] */int tm_mday; /* 一个月中的日期 - 取值区间为[1,31] */int tm_mon; /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */int tm_year; /* 年份,其值从1900开始 */int tm_wday; /* 星期–取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */int tm_yday;    /* 从每年的1月1日开始的天数 - 取值区间为[0,365],其中0代表1月1日,1代表1月2日,一次类推 */int  tm_isdst;  /* 夏令时标识符。在实行夏令时的时候,tm_isdst为正;不实行夏令时的时候tm_isdst为0;否则为负 */
};

typedef struct tm   ngx_tm_t;

#define ngx_tm_sec            tm_sec#define ngx_tm_min            tm_min#define ngx_tm_hour           tm_hour#define ngx_tm_mday           tm_mday#define ngx_tm_mon            tm_mon#define ngx_tm_year           tm_year#define ngx_tm_wday           tm_wday#define ngx_tm_isdst          tm_isdst

从上面的定义可以看出,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毫秒

版权声明:Pain is just in your mind.

以上就介绍了Nginx 定时器,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

人气教程排行