1. 程式人生 > >ngx lua獲取時間戳的幾種方式

ngx lua獲取時間戳的幾種方式

在ngx_lua裡,獲取時間相關資訊的方式大概有4種(見下面程式碼):

print(string.format("%s, %s, %s, %s", ngx.time(), os.time(), os.clock(), ngx.now()))
ngx.exit(200)

-- 以上程式碼會輸出:1486971340, 1486971340, 209.77, 1486971340.422

可見,通過os.clock()獲取到的並不是時間戳,它獲取的是一個程式使用CPU時間的一個近似值,而我們的目的是獲取時間戳,所以排除掉這種方法。

再看ngx.time()os.time(),它們返回的都是秒級精度的時間戳,而ngx.now()

返回的是毫秒級精度的時間戳。做開發時可以根據實際的精度需要來選擇不同的獲取方式。

那麼,ngx.time()os.time()有什麼區別嗎?
有,os.time()會涉及系統呼叫,而ngx.time()不會,所以ngx.time()的效能會比os.time()高。

但在使用ngx.time()ngx.now()的時候,有一點是要注意的,就是通過這兩種方式獲取到的只是nginx快取起來的時間戳,不是實時的。所以有時候會出現一些比較奇怪的現象,比如下面程式碼:

local t1 = ngx.now()
for i=1,1000000 do
end
local t2 = ngx.now()
print
(t1, ",", t2) -- 輸出1487053211.321,1487053211.321 ngx.exit(200)

正常來說,t2應該大於t1才對,但由於nginx沒有及時更新(快取的)時間戳,所以導致t2t1獲取到的時間戳是一樣的。那麼怎樣才能強迫nginx更新快取呢?呼叫多一個ngx.update_time()函式即可:

local t1 = ngx.now()
for i=1,1000000 do
end
ngx.update_time()
local t2 = ngx.now()
print(t1, ",", t2) -- 輸出1487054647.584,1487054647.586
ngx.exit(200
)

可見,獲取到的時間戳已經發生了改變。