Rumah >Operasi dan penyelenggaraan >Nginx >Bagaimana nginx menggunakan ctx untuk mencapai perkongsian data

Bagaimana nginx menggunakan ctx untuk mencapai perkongsian data

PHPz
PHPzke hadapan
2023-05-14 17:25:181649semak imbas

Persekitaran: 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

Jadual Lua ini boleh digunakan untuk menyimpan data persekitaran Lua berasaskan permintaan, dan hayatnya adalah sama dengan permintaan semasa (serupa dengan pembolehubah Nginx).

Rujuk contoh di bawah,

lokasi /ujian {

tulis semula_oleh_lua_sekat {

        ngx.ctx.foo = 76

}

access_by_lua_block {

        ngx.ctx.foo = ngx.ctx.foo + 3

}

content_by_lua_block {

        ngx.say(ngx.ctx.foo)

}

}

Akses GET /test output

79

Iaitu, entri ngx.ctx.foo adalah konsisten merentasi peringkat penulisan semula, akses dan pemprosesan kandungan permintaan.

Setiap permintaan, termasuk subpermintaan, mempunyai jadual ngx.ctx sendiri. Contohnya:

lokasi /sub {

content_by_lua_block {

        ngx.say("sub pre: ", ngx.ctx.blah)

        ngx.ctx.blah = 32

        ngx.say("sub post: ", ngx.ctx.blah)

}

}

lokasi /utama {

content_by_lua_block {

        ngx.ctx.blah = 73

        ngx.say("pra utama: ", ngx.ctx.blah)

Res setempat = ngx.location.capture("/sub")

        ngx.print(res.body)

        ngx.say("catatan utama: ", ngx.ctx.blah)

}

}

Akses GET /output utama

pra utama: 73

sub pra: tiada

sub post: 32

jawatan utama: 73

Di sini, mengubah suai entri ngx.ctx.blah dalam permintaan anak tidak menjejaskan entri dengan nama yang sama dalam permintaan induk, kerana mereka masing-masing mengekalkan versi ngx.ctx.blah yang berbeza.

Ubah hala dalaman akan memusnahkan data ngx.ctx (jika ada) dalam permintaan asal dan permintaan baharu akan mempunyai jadual ngx.ctx kosong. Contohnya,

lokasi /baharu {

content_by_lua_block {

        ngx.say(ngx.ctx.foo)

}

}

lokasi /orig {

content_by_lua_block {

        ngx.ctx.foo = "hello"

        ngx.exec("/baru")

}

}

Mengakses GET /orig akan mengeluarkan

tiada

bukannya nilai "hello" asal.

Nilai data sewenang-wenangnya, termasuk penutupan Lua dan jadual bersarang, boleh dimasukkan ke dalam jadual "ajaib" ini, yang turut membenarkan metakaedah tersuai didaftarkan.

Anda juga boleh menulis ganti ngx.ctx dengan jadual Lua baharu, mis ngx.ctx = { foo = 32, bar = 54 }

Apabila digunakan dalam persekitaran init_worker_by_lua*, jadual ini adalah sama dengan pemegang Lua semasa sepanjang hayat.

Pertanyaan jadual ngx.ctx memerlukan panggilan meta-kaedah yang agak mahal, yang jauh lebih perlahan daripada menghantar data berasaskan permintaan terus melalui parameter fungsi pengguna sendiri. Oleh itu, jangan menyalahgunakan API ini hanya untuk menyimpan parameter fungsi pengguna, kerana ia mungkin mempunyai kesan yang ketara terhadap prestasi.

Dan kerana metamethod "sihir", jangan cuba menggunakan tahap "tempatan" ngx.ctx pada tahap modul lua, contohnya perkongsian data peringkat pekerja. Contoh berikut adalah buruk:

-- mymodule.lua

tempatan _M = {}

-- Ngx.ctx dalam baris berikut tergolong dalam satu permintaan, tetapi pembolehubah ctx berada pada tahap modul Lua

-- dan kepunyaan seorang pekerja.

ctx tempatan = ngx.ctx

fungsi _M.main()

ctx.foo = "bar"

tamat

kembali _M

Yang berikut hendaklah digunakan sebaliknya:

-- mymodule.lua

tempatan _M = {}

fungsi _M.utama(ctx)

ctx.foo = "bar"

tamat

kembali _M

Maksudnya, panggilan pemanggil ke jadual ctx harus diselesaikan dengan menghantar parameter fungsi.

Atas ialah kandungan terperinci Bagaimana nginx menggunakan ctx untuk mencapai perkongsian data. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:yisu.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam