Files
2026-07-13 12:32:21 +08:00

60 lines
1.3 KiB
Lua

local _M = {}
---
-- Check if the phase is yieldable.
-- @tparam string phase the phase to check, if not specified then
-- the default value will be the current phase
-- @treturn boolean true if the phase is yieldable, false otherwise
local in_yieldable_phase
do
local get_phase = ngx.get_phase
-- https://github.com/openresty/lua-nginx-module/blob/c89469e920713d17d703a5f3736c9335edac22bf/src/ngx_http_lua_util.h#L35C10-L35C10
local LUA_CONTEXT_YIELDABLE_PHASE = {
rewrite = true,
server_rewrite = true,
access = true,
content = true,
timer = true,
ssl_client_hello = true,
ssl_certificate = true,
ssl_session_fetch = true,
preread = true,
}
in_yieldable_phase = function(phase)
return LUA_CONTEXT_YIELDABLE_PHASE[phase or get_phase()]
end
end
_M.in_yieldable_phase = in_yieldable_phase
local yield
do
local ngx_sleep = _G.native_ngx_sleep or ngx.sleep
local YIELD_ITERATIONS = 1000
local counter = YIELD_ITERATIONS
yield = function(in_loop, phase)
if ngx.IS_CLI or not in_yieldable_phase(phase) then
return
end
if in_loop then
counter = counter - 1
if counter > 0 then
return
end
counter = YIELD_ITERATIONS
end
ngx_sleep(0) -- yield
end
end
_M.yield = yield
return _M