ホームページ > 運用・保守 > Nginx > nginx が ctx を使用してデータ共有を実現する方法

nginx が ctx を使用してデータ共有を実現する方法

PHPz
リリース: 2023-05-14 17:25:18
転載
1646 人が閲覧しました

環境: 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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yisu.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート