環境: 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
この Lua テーブルはリクエストベースの Lua 環境データを保存するために使用でき、その有効期間は現在のリクエストと同じです (Nginx 変数と同様)。
次の例を参照してください。
場所/テスト {
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 エントリは、リクエストの書き換え、アクセス、コンテンツ処理の各段階にわたって一貫しています。
サブリクエストを含む各リクエストには、独自の ngx.ctx テーブルがあります。例えば:###### 場所/サブ {
content_by_lua_block {
ngx.say("sub pre: ", ngx.ctx.blah)
ngx.ctx.blah = 32
ngx.say("サブ投稿: ", ngx.ctx.blah)
}
}
場所/メイン {
content_by_lua_block {
ngx.ctx.blah = 73
ngx.say("main pre: ", ngx.ctx.blah)
ローカル解像度 = ngx.location.capture("/sub")
ngx.print(res.body)
ngx.say("メイン投稿: ", ngx.ctx.blah)
}
}
GET /main 出力へのアクセス
メインプリ: 73
サブプレ: nil
サブポスト: 32
メインポスト: 73
ここで、子リクエストの ngx.ctx.blah エントリを変更しても、親リクエストの同じ名前のエントリには影響しません。これは、それぞれが異なるバージョンの ngx.ctx.blah を保持しているためです。
内部リダイレクトにより、元のリクエスト内の ngx.ctx データ (存在する場合) が破壊され、新しいリクエストには空の ngx.ctx テーブルが含まれます。例えば、###### 場所/新しい {
content_by_lua_block {
ngx.say(ngx.ctx.foo)
}
}
場所 /orig {
content_by_lua_block {
ngx.ctx.foo = "こんにちは"
ngx.exec("/new")
}
}
GET /orig にアクセスすると
が出力されます nil
元の「hello」値の代わりに。
Lua クロージャやネストされたテーブルを含む任意のデータ値をこの「マジック」テーブルに挿入でき、これによりカスタム メタメソッドを登録することもできます。
ngx.ctx を新しい Lua テーブル (例:
) で上書きすることもできます。 ngx.ctx = { foo = 32、bar = 54 }
init_worker_by_lua* 環境で使用される場合、このテーブルは現在の Lua ハンドルの有効期間と同じになります。
ngx.ctx テーブル クエリには比較的高価なメタメソッド呼び出しが必要ですが、これはユーザー独自の関数パラメーターを介してリクエストベースのデータを直接渡すよりもはるかに時間がかかります。したがって、パフォーマンスに重大な影響を与える可能性があるため、ユーザー関数パラメーターを保存するためだけにこの API を悪用しないでください。
また、メタメソッド「マジック」のため、ワーカーレベルのデータ共有など、lua モジュールレベルで「ローカル」レベルの ngx.ctx を使用しないでください。次の例は不適切です:
-- mymodule.lua
ローカル _M = {}
-- 次の行の ngx.ctx は 1 つのリクエストに属しますが、ctx 変数は Lua モジュール レベルです。
-- そして単一の労働者に属します。
ローカル ctx = ngx.ctx
関数 _M.main()
ctx.foo = "バー"
終わり###### _M
を返す 代わりに次のものを使用する必要があります:
-- mymodule.lua
ローカル _M = {}
関数_M.main(ctx)
ctx.foo = "バー"
終わり###### _M
を返す つまり、呼び出し元による ctx テーブルの呼び出しは、関数パラメーターを渡すことによって完了する必要があります。
以上がnginx が ctx を使用してデータ共有を実現する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。