環境: 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 変数と同様)。 次の例を参照してください。 場所 /テスト { 書き換えブロック { ngx.ctx.foo = 76 } アクセス_by_lua_ブロック { ngx.ctx.foo = ngx.ctx.foo + 3 } コンテンツ_by_lua_block { ngx.say(ngx.ctx.foo) } } GET /test 出力にアクセスする
つまり、ngx.ctx.foo エントリは、リクエストの書き換え、アクセス、およびコンテンツ処理の各フェーズにわたって一貫性を保ちます。 サブリクエストを含む各リクエストには、ngx.ctx テーブルの独自のコピーがあります。例えば: 場所 /sub { コンテンツ_by_lua_block { ngx.say("サブプレ: ", ngx.ctx.blah) ngx.ctx.blah = 32 ngx.say("サブ投稿: ", ngx.ctx.blah) } } 場所 /main { コンテンツ_by_lua_block { ngx.ctx.blah = 73 ngx.say("メイン pre: ", ngx.ctx.blah) ローカル res = ngx.location.capture("/sub") ngx.print(res.body) ngx.say("メイン投稿: ", ngx.ctx.blah) } } GET /main出力にアクセスする
ここで、子リクエストの ngx.ctx.blah エントリを変更しても、親リクエストの同じ名前のエントリには影響しません。これは、それぞれが異なるバージョンの ngx.ctx.blah を保持しているためです。 内部リダイレクトにより、元のリクエスト内の ngx.ctx データ (存在する場合) が破棄され、新しいリクエストには空の ngx.ctx テーブルが含まれます。例えば、 場所 /new { コンテンツ_by_lua_block { ngx.say(ngx.ctx.foo) } } 場所 / 元 { コンテンツ_by_lua_block { ngx.ctx.foo = "こんにちは" ngx.exec("/new") } } GET /origにアクセスすると、出力されます
元の「hello」値の代わりに。 この「マジック」テーブルには、Lua クロージャやネストされたテーブルなどの任意のデータ値を挿入することができ、カスタム メタメソッドの登録も可能になります。 ngx.ctxを新しいLuaテーブルで上書きすることも可能です。たとえば、 init_worker_by_lua* コンテキストで使用される場合、このテーブルの有効期間は現在の Lua ハンドルと同じになります。 ngx.ctx テーブルの検索には比較的コストのかかるメタメソッド呼び出しが必要であり、これはユーザー独自の関数引数を介してリクエストベースのデータを直接渡すよりもはるかに遅くなります。したがって、パフォーマンスに大きな影響を与える可能性があるため、ユーザー関数パラメータを保存するためにこの API を乱用しないでください。 また、メタメソッドの「マジック」のため、ワーカー レベルのデータ共有など、Lua モジュール レベルで「ローカル」レベルの ngx.ctx を使用しないでください。次の例は良くありません。 -- mymodule.lua ローカル _M = {} -- 次の行の ngx.ctx は単一のリクエストに属しますが、ctx 変数は Lua モジュール レベルにあります。 -- そして、それは一人の労働者に属します。 ローカル ctx = ngx.ctx 関数_M.main() ctx.foo = "バー" 終わり _Mを返す 代わりに以下を使用する必要があります。 -- mymodule.lua ローカル _M = {} 関数_M.main(ctx) ctx.foo = "バー" 終わり _Mを返す つまり、呼び出し元は関数にパラメータを渡して ctx テーブルへの呼び出しを完了する必要があります。 要約する 上記はこの記事の全内容です。この記事の内容が皆さんの勉強や仕事に一定の参考学習価値を持つことを願っています。ご質問があれば、メッセージを残してコミュニケーションしてください。123WORDPRESS.COM を応援していただきありがとうございます。 以下もご興味があるかもしれません:
|
<<: Mysql 5.6ではユーザー名とパスワードを変更するメソッドが追加されました
序文偶然、30 分の Tomcat セッション時間は、セッションが作成された後、30 分間のみ有効で...
以前、単純な UDP サーバーとクライアントの例を書きましたが、その中で、自分自身をクライアントと見...
今日の午後からVS2019をMySQLで使えるのではないかと思い、いろいろ環境構築を始めました。プロ...
この記事では、シンプルな画像カルーセル効果を実現するためのJSの具体的なコードを参考までに紹介します...
最近、プロジェクトをアップグレードするために Docker を使用しました。これまで使用したことがな...
問題:あるサーバー上の PHP プログラムは、localhost アドレス経由でデータベースに接続で...
MySQL 5.5 のインストールと設定方法のグラフィックチュートリアルMySQL 5.5 のインス...
目次1. v-text テキストレンダリング命令2. v-html 1. v-text テキストレン...
目次1. 背景2. 複合インデックスを理解する3. 左端一致原則4. フィールド順序の影響5. 単一...
MySQL 5.7.20 zipインストール、具体的な内容は次のとおりです(1)圧縮パッケージを解凍...
1. MySQLイメージを取得する docker pull mysql:5.6注: mysql5.7...
最近、docker load -i コマンドを使用してイメージ パッケージを圧縮した後、イメージ名と...
目次Mysql マスタースレーブ同期構成1. 2つのmysqlをインストールする2. MySQL設定...
ミニプログラムはユーザーの個人情報を収集してアップロードしましたが、拒否されました。こんにちは、ミニ...
この記事では、スライディングカルーセル効果を実現するためのjsの具体的なコードを参考までに共有します...