一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

云服務(wù)器|WEB服務(wù)器|FTP服務(wù)器|郵件服務(wù)器|虛擬主機(jī)|服務(wù)器安全|DNS服務(wù)器|服務(wù)器知識(shí)|Nginx|IIS|Tomcat|

服務(wù)器之家 - 服務(wù)器技術(shù) - Nginx - nginx利用ctx實(shí)現(xiàn)數(shù)據(jù)共享、修改上下文功能

nginx利用ctx實(shí)現(xiàn)數(shù)據(jù)共享、修改上下文功能

2020-01-02 15:01沈七 Nginx

這篇文章主要給大家介紹了關(guān)于nginx利用ctx實(shí)現(xiàn)數(shù)據(jù)共享、修改上下文功能的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

環(huán)境: init_worker_by_lua, set_by_lua, rewrite_by_lua, access_by_lua, content_by_lua, header_filter_by_lua, body_filter_by_lua, log_by_lua, ngx.timer., balancer_by_lua

這個(gè) Lua 表可以用來存儲(chǔ)基于請(qǐng)求的 Lua 環(huán)境數(shù)據(jù),其生存周期與當(dāng)前請(qǐng)求相同 (類似 Nginx 變量)。

參考下面例子,

?
1
2
3
4
5
6
7
8
9
10
11
location /test {
 rewrite_by_lua_block {
  ngx.ctx.foo = 76
 }
 access_by_lua_block {
  ngx.ctx.foo = ngx.ctx.foo + 3
 }
 content_by_lua_block {
  ngx.say(ngx.ctx.foo)
 }
}

訪問 GET /test 輸出

79

也就是說,ngx.ctx.foo 條目跨越一個(gè)請(qǐng)求的 rewrite (重寫),access (訪問),和 content (內(nèi)容) 各處理階段保持一致。

每個(gè)請(qǐng)求,包括子請(qǐng)求,都有一份自己的 ngx.ctx 表。例如:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
location /sub {
 content_by_lua_block {
  ngx.say("sub pre: ", ngx.ctx.blah)
  ngx.ctx.blah = 32
  ngx.say("sub post: ", ngx.ctx.blah)
 }
}
 
location /main {
 content_by_lua_block {
  ngx.ctx.blah = 73
  ngx.say("main pre: ", ngx.ctx.blah)
  local res = ngx.location.capture("/sub")
  ngx.print(res.body)
  ngx.say("main post: ", ngx.ctx.blah)
 }
}

訪問 GET /main 輸出

main pre: 73
sub pre: nil
sub post: 32
main post: 73

這里,在子請(qǐng)求中修改 ngx.ctx.blah 條目并不影響父請(qǐng)求中的同名條目,因?yàn)樗鼈兏髯跃S護(hù)不同版本的 ngx.ctx.blah。

內(nèi)部重定向?qū)⒋輾г颊?qǐng)求中的 ngx.ctx 數(shù)據(jù) (如果有),新請(qǐng)求將會(huì)有一個(gè)空白的 ngx.ctx 表。例如,

?
1
2
3
4
5
6
7
8
9
10
11
12
location /new {
 content_by_lua_block {
  ngx.say(ngx.ctx.foo)
 }
}
 
location /orig {
 content_by_lua_block {
  ngx.ctx.foo = "hello"
  ngx.exec("/new")
 }
}

訪問 GET /orig 將輸出

nil

而不是原始的 "hello" 值。

任意數(shù)據(jù)值,包括 Lua 閉包與嵌套表,都可以被插入這個(gè)“魔法”表,也允許注冊(cè)自定義元方法。

也可以將 ngx.ctx 覆蓋為一個(gè)新 Lua 表,例如,

ngx.ctx = { foo = 32, bar = 54 }

當(dāng)用在 init_worker_by_lua* 環(huán)境中,這個(gè)表與當(dāng)前 Lua 句柄生命周期相同。

ngx.ctx 表查詢需要相對(duì)昂貴的元方法調(diào)用,這比通過用戶自己的函數(shù)參數(shù)直接傳遞基于請(qǐng)求的數(shù)據(jù)要慢得多。所以不要為了節(jié)約用戶函數(shù)參數(shù)而濫用此 API,因?yàn)樗赡軐?duì)性能有明顯影響。

而且由于元方法“魔法”,不要在 lua 模塊級(jí)別試圖使用 "local" 級(jí)別的 ngx.ctx ,例如 worker-level data sharing。下面示例是糟糕的:

-- mymodule.lua

local _M = {}

-- 下面一行的 ngx.ctx 是屬于單個(gè)請(qǐng)求的,但 ctx 變量是在 Lua 模塊級(jí)別

-- 并且屬于單個(gè) worker 的。

?
1
2
3
4
5
6
7
local ctx = ngx.ctx
 
function _M.main()
 ctx.foo = "bar"
end
 
return _M

應(yīng)使用下面方式替代:

?
1
2
3
4
5
6
7
8
-- mymodule.lua
local _M = {}
 
function _M.main(ctx)
 ctx.foo = "bar"
end
 
return _M

就是說,調(diào)用者對(duì) ctx 表調(diào)用應(yīng)通過函數(shù)傳參方式完成。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)服務(wù)器之家的支持。

原文鏈接:http://www.cnblogs.com/shenlinken/p/10156185.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 公妇仑乱在线观看 | 欧美高清videosdesex0 | 好男人好资源在线观看 | 日韩毛片免费在线观看 | 九9热这里真品 | 国产一区在线看 | 亚洲www视频 | 按摩院已婚妇女中文字幕 | 亚洲日韩精品欧美一区二区一 | 成人香蕉xxxxxxx | 三年片韩国在线 | 嫩交18xxxx | 四虎网站最新网址 | 亚洲国产在 | 亚洲欧洲色图 | 国产区成人综合色在线 | 女人肮脏的交易中文字幕未删减版 | 天堂在线看 | 日本理论片中文在线观看2828 | 国产欧美va欧美va香蕉在线观看 | 亚洲一级片在线播放 | 好大好硬好紧太深了受不了 | 亚洲国产精品自在现线让你爽 | 日本三级在丈面前被耍了 | 兽操人| 五月一区二区久久综合天堂 | 99福利视频导航 | 狠狠搞视频 | 精品国产91久久久久 | 四虎影院在线免费播放 | 国产成人免费高清激情视频 | 护士的小嫩嫩好紧好舒服 | 消息称老熟妇乱视频一区二区 | 国产黑丝一区 | 免费成年网| jj视频免费 | 精品精品久久宅男的天堂 | 艾秋麻豆果冻传媒老狼仙踪林 | 97午夜视频 | 万域之王动漫在线观看全集免费播放 | 欧美高清在线不卡免费观看 |