feature: added ngx.req.start_time() to return the request starting time in seconds (the milliseconds part is the decimal part just as in ngx.now). thanks Matthieu Tourne for the patch.

This commit is contained in:
agentzh (Yichun Zhang) 2012-12-06 18:15:41 -08:00
Родитель e83fabb0e5
Коммит 5768a6824d
8 изменённых файлов: 190 добавлений и 12 удалений

12
README
Просмотреть файл

@ -3472,6 +3472,18 @@ Nginx API for Lua
...
end
ngx.req.start_time
syntax: *secs = ngx.req.start_time()*
context: *set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*,
header_filter_by_lua*, body_filter_by_lua*, log_by_lua**
Returns a floating-point number representing the timestamp (including
milliseconds as the decimal part) when the current request was created.
The following example is similar to $request_time in Nginx log module :
local request_time = ngx.now() - ngx.req.start_time()
ngx.is_subrequest
syntax: *value = ngx.is_subrequest*

Просмотреть файл

@ -3196,6 +3196,19 @@ Parse the http time string (as returned by [ngx.http_time](http://wiki.nginx.org
end
ngx.req.start_time
------------------
**syntax:** *secs = ngx.req.start_time()*
**context:** *set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua**
Returns a floating-point number representing the timestamp (including milliseconds as the decimal part) when the current request was created.
The following example is similar to $request_time in Nginx log module :
local request_time = ngx.now() - ngx.req.start_time()
ngx.is_subrequest
-----------------
**syntax:** *value = ngx.is_subrequest*

Просмотреть файл

@ -3086,6 +3086,18 @@ Parse the http time string (as returned by [[#ngx.http_time|ngx.http_time]]) int
end
</geshi>
== ngx.req.start_time ==
'''syntax:''' ''secs = ngx.req.start_time()''
'''context:''' ''set_by_lua*, rewrite_by_lua*, access_by_lua*, content_by_lua*, header_filter_by_lua*, body_filter_by_lua*, log_by_lua*''
Returns a floating-point number representing the timestamp (including milliseconds as the decimal part) when the current request was created.
The following example is similar to $request_time in Nginx log module :
<geshi lang="nginx">
local request_time = ngx.now() - ngx.req.start_time()
</geshi>
== ngx.is_subrequest ==
'''syntax:''' ''value = ngx.is_subrequest''

Просмотреть файл

@ -4,6 +4,7 @@
#include "ddebug.h"
#include "ngx_http_lua_time.h"
#include "ngx_http_lua_util.h"
static int ngx_http_lua_ngx_today(lua_State *L);
@ -15,6 +16,7 @@ static int ngx_http_lua_ngx_cookie_time(lua_State *L);
static int ngx_http_lua_ngx_http_time(lua_State *L);
static int ngx_http_lua_ngx_parse_http_time(lua_State *L);
static int ngx_http_lua_ngx_update_time(lua_State *L);
static int ngx_http_lua_ngx_req_start_time(lua_State *L);
static int
@ -175,6 +177,25 @@ ngx_http_lua_ngx_parse_http_time(lua_State *L)
}
static int
ngx_http_lua_ngx_req_start_time(lua_State *L)
{
ngx_http_request_t *r;
lua_pushlightuserdata(L, &ngx_http_lua_request_key);
lua_rawget(L, LUA_GLOBALSINDEX);
r = lua_touserdata(L, -1);
lua_pop(L, 1);
if (r == NULL) {
return luaL_error(L, "no request found");
}
lua_pushnumber(L, (lua_Number) (r->start_sec + r->start_msec / 1000.0L));
return 1;
}
void
ngx_http_lua_inject_time_api(lua_State *L)
{
@ -211,7 +232,15 @@ ngx_http_lua_inject_time_api(lua_State *L)
lua_pushcfunction(L, ngx_http_lua_ngx_http_time);
lua_setfield(L, -2, "http_time");
lua_pushcfunction(L, ngx_http_lua_ngx_parse_http_time);
lua_pushcfunction(L, ngx_http_lua_ngx_parse_http_time);
lua_setfield(L, -2, "parse_http_time");
}
void
ngx_http_lua_inject_req_time_api(lua_State *L)
{
lua_pushcfunction(L, ngx_http_lua_ngx_req_start_time);
lua_setfield(L, -2, "start_time");
}

Просмотреть файл

@ -6,7 +6,7 @@
void ngx_http_lua_inject_time_api(lua_State *L);
void ngx_http_lua_inject_req_time_api(lua_State *L);
#endif /* NGX_HTTP_LUA_TIME_H */

Просмотреть файл

@ -1999,19 +1999,15 @@ ngx_http_lua_inject_req_api(ngx_log_t *log, lua_State *L)
{
/* ngx.req table */
lua_createtable(L, 0 /* narr */, 20 /* nrec */); /* .req */
lua_createtable(L, 0 /* narr */, 21 /* nrec */); /* .req */
ngx_http_lua_inject_req_header_api(log, L);
ngx_http_lua_inject_req_uri_api(log, L);
ngx_http_lua_inject_req_args_api(L);
ngx_http_lua_inject_req_body_api(L);
ngx_http_lua_inject_req_socket_api(L);
ngx_http_lua_inject_req_method_api(L);
ngx_http_lua_inject_req_time_api(L);
lua_setfield(L, -2, "req");
}
@ -3271,4 +3267,3 @@ ngx_http_lua_test_expect(ngx_http_request_t *r)
return NGX_ERROR;
}

Просмотреть файл

@ -124,7 +124,7 @@ n = 1
--- request
GET /test
--- response_body
n = 20
n = 21
--- no_error_log
[error]
@ -146,7 +146,7 @@ n = 20
--- request
GET /test
--- response_body
n = 20
n = 21
--- no_error_log
[error]
@ -173,7 +173,7 @@ n = 20
--- request
GET /test
--- response_body
n = 20
n = 21
--- no_error_log
[error]

117
t/102-req-start-time.t Normal file
Просмотреть файл

@ -0,0 +1,117 @@
# -*- mode: conf -*-
# vim:set ft= ts=4 sw=4 et fdm=marker:
use lib 'lib';
use Test::Nginx::Socket;
#worker_connections(1014);
#master_process_enabled(1);
log_level('warn');
repeat_each(2);
plan tests => repeat_each() * (blocks() * 3);
#no_diff();
no_long_string();
run_tests();
__DATA__
=== TEST 1: start time
--- config
location = /start {
content_by_lua 'ngx.say(ngx.req.start_time())';
}
--- request
GET /start
--- response_body_like: ^\d{10,}(\.\d+)?$
--- no_error_log
[error]
=== TEST 2: start time in set_by_lua
--- config
location = /start {
set_by_lua $a 'return ngx.req.start_time()';
echo $a;
}
--- request
GET /start
--- response_body_like: ^\d{10,}(\.\d+)?$
--- no_error_log
[error]
=== TEST 3: request time
--- config
location = /req_time {
content_by_lua '
ngx.sleep(0.1)
local req_time = ngx.now() - ngx.req.start_time()
ngx.say(req_time)
ngx.say(ngx.req.start_time() < ngx.now())
';
}
--- request
GET /req_time
--- response_body_like chop
^(?:0\.[12]|0\.099)\d*
true$
--- no_error_log
[error]
=== TEST 4: request time update
--- config
location = /req_time {
content_by_lua '
ngx.sleep(0.1)
local req_time = ngx.now() - ngx.req.start_time()
ngx.sleep(0.1)
ngx.update_time()
local req_time_updated = ngx.now() - ngx.req.start_time()
ngx.say(req_time)
ngx.say(req_time_updated)
ngx.say(req_time_updated > req_time)
';
}
--- request
GET /req_time
--- response_body_like chomp
^(?:0\.[12]|0\.099)\d*
0\.\d+
true$
--- no_error_log
[error]
=== TEST 5: init_by_lua
--- http_config
init_by_lua '
time = ngx.req.start_time()
';
--- config
location = /t {
content_by_lua '
ngx.say(time)
';
}
--- request
GET /t
--- response_body
--- no_error_log
[error]
--- SKIP