原文链接:http://cjhust.blog.163.com/blog/static/17582715720124544047608/
1、数据结构
ngx_conf_s
ngx_array_t *args; //指令参数,从文件读入并放入这个数组
ngx_cycle_t *cycle; //指向系统参数
ngx_pool_t *pool; //内存池
ngx_conf_file_t *conf_file; //配置文件信息 “./conf/main.conf”
ngx_log_t *log; //日志
void *ctx; //(void ****)cycle->conf_ctx,装的是所有模块的配置信息
ngx_uint_t module_type; //处理当前指令的模块的类型
ngx_uint_t cmd_type; //处理这个指令的命令的类型
ngx_conf_handler_pt handler; //指令处理函数
char *handler_conf; //这个是配合上面的handler使用
备注:该结构体主要用于读取配置时候,从配置文件和系统参数之间,ngx_conf_s起着桥梁的作用。
ngx_http_conf_ctx_t
备注:HTTP block中的配置结构主要分为3中,main、server{}、location{}。
ngx_http_module_t
备注:HTTP模块中的ctx主要有上面8个函数组成。
ngx_command_s
struct ngx_command_s {
ngx_str_t name;
ngx_uint_t type;
char *(*set)(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
ngx_uint_t conf;
ngx_uint_t offset;
void *post;
};
#define ngx_null_command { ngx_null_string, 0, NULL, 0, 0, NULL }
2、HTTP ctx
2.1 create_main_conf(ngx_conf_t *cf)
参数:ngx_conf_t *cf,配置结构体;
返回值:void *;
备注:返回值可以作为ngx_http_conf_get_module_main_conf和gx_http _get_module_ main _conf的结果;
示例:
static void * ngx_http_barrier_create_conf(ngx_conf_t *cf)
{
ngx_http_barrier_conf_t *conf; //自定义的一个结构
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_barrier_conf_t)); //init by pcalloc
if (conf == NULL) {
return NULL;
}
conf->enable = NGX_CONF_UNSET;
return conf; //返回自定义的结构
}
2.2 create_srv_conf(ngx_conf_t *cf)
参数:ngx_conf_t *cf,配置结构体;
返回值:void *;
备注:返回值可以作为ngx_http_conf_get_module_srv_conf和gx_http _get_module_ srv_conf的结果;
示例:
static void * ngx_http_barrier_create_conf(ngx_conf_t *cf)
{
ngx_http_barrier_conf_t *conf; //自定义的一个结构
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_barrier_conf_t)); //init by pcalloc
if (conf == NULL) {
return NULL;
}
conf->enable = NGX_CONF_UNSET;
return conf; //返回自定义的结构
}
2.3 create_loc_conf(ngx_conf_t *cf)
参数:ngx_conf_t *cf,配置结构体;
返回值:void *;
备注:返回值可以作为ngx_http_conf_get_module_loc_conf和gx_http _get_module_loc_conf的结果;
示例:
static void * ngx_http_barrier_create_conf(ngx_conf_t *cf)
{
ngx_http_barrier_conf_t *conf; //自定义的一个结构
conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_barrier_conf_t)); //init by pcalloc
if (conf == NULL) {
return NULL;
}
conf->enable = NGX_CONF_UNSET;
return conf; //返回自定义的结构
}
2.4 preconfiguration(ngx_conf_t *cf)
参数:ngx_conf_t *cf,配置结构体;
返回值:ngx_int_t;
备注:返回值只是作为操作是否正确的一个判断;
示例:
static ngx_int_t
ngx_http_ssl_add_variables(ngx_conf_t *cf)
{
ngx_http_variable_t *var, *v;
for (v = ngx_http_ssl_vars; v->name.len; v++) {
var = ngx_http_add_variable(cf, &v->name, v->flags);
if (var == NULL) {
return NGX_ERROR;
}
var->get_handler = v->get_handler;
var->data = v->data;
}
return NGX_OK;
}
2.5 init_main_conf(ngx_conf_t *cf, void *conf)
参数:ngx_conf_t *cf和conf,conf是create_main时的返回值,在这里作为参数;
返回值:char *,NGX_CONF_OK表示成功;
备注:返回值只是作为操作是否正确的一个判断;
示例:
static char *
ngx_http_core_init_main_conf(ngx_conf_t *cf, void *conf)
{
ngx_http_core_main_conf_t *cmcf = conf;
//create_main时是未配置
if (cmcf->server_names_hash_max_size == NGX_CONF_UNSET_UINT) {
cmcf->server_names_hash_max_size = 512; //这里是init
}
if (cmcf->server_names_hash_bucket_size == NGX_CONF_UNSET_UINT) {
cmcf->server_names_hash_bucket_size = ngx_cacheline_size;
}
cmcf->server_names_hash_bucket_size =
ngx_align(cmcf->server_names_hash_bucket_size, ngx_cacheline_size);
if (cmcf->variables_hash_max_size == NGX_CONF_UNSET_UINT) {
cmcf->variables_hash_max_size = 512;
}
if (cmcf->variables_hash_bucket_size == NGX_CONF_UNSET_UINT) {
cmcf->variables_hash_bucket_size = 64;
}
cmcf->variables_hash_bucket_size =
ngx_align(cmcf->variables_hash_bucket_size, ngx_cacheline_size);
if (cmcf->ncaptures) {
cmcf->ncaptures = (cmcf->ncaptures + 1) * 3;
}
return NGX_CONF_OK;
}
2.6 merge_srv_conf(ngx_conf_t *cf, void *prev, void *conf)
参数:ngx_conf_t *cf,配置结构体,prev是main的配置结构体,conf是server的配置结构体;prev=cf->ctx.srv_conf[ctx_index],c/span>
返回值:char *,正确返回值是NGX_CONF_OK;
备注:返回值只是作为操作是否正确的一个判断;
示例:
static char * ngx_http_barrier_merge_conf(ngx_conf_t *cf, void *parent, void *child)
{
ngx_http_barrier_conf_t *prev = parent;
ngx_http_barrier_conf_t *conf = child;
if (conf->shm_zone == NULL){
*conf = *prev;
}
ngx_conf_merge_value(conf->enable, prev->enable, 0); //default is 0
return NGX_CONF_OK;
}
备注:merge server的主要功能是,如果main里配置了enable=1,而server{}里enable= NGX_CONF_UNSET,则将server的enable=main的enable=1;
2.7 merge_loc_conf(ngx_conf_t *cf, void *prev, void *conf)
原理同merge_srv_conf(ngx_conf_t *cf, void *prev, void *conf)
2.8 postconfiguration(ngx_conf_t *cf)
参数:ngx_conf_t *cf;
返回值:ngx_int_t,正确返回值是NGX_OK;
备注:返回值只是作为操作是否正确的一个判断;
示例:
static ngx_int_t ngx_http_tracker_init(ngx_conf_t *cf)
{
ngx_tracker_flag = 0;
return NGX_OK;
}
备注:将全局变量flag清零,用于判断是否有barrier模块。如果不清零,将会导致如果配置中没有添加barrier zone,在kill –HUP时,由于全局变量flag值不变,即不为0, 用户在执行traker指令时,出现段错误。
3、HTTP commands
4、常用变量
#define NGX_HTTP_MAIN_CONF 0x02000000 //指令存放位置
#define NGX_HTTP_SRV_CONF 0x04000000
#define NGX_HTTP_LOC_CONF 0x08000000
#define NGX_HTTP_UPS_CONF 0x10000000
#define NGX_HTTP_SIF_CONF 0x20000000
#define NGX_HTTP_LIF_CONF 0x40000000
#define NGX_HTTP_LMT_CONF 0x80000000
#define NGX_HTTP_MAIN_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, main_conf)
#define NGX_HTTP_SRV_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, srv_conf)
#define NGX_HTTP_LOC_CONF_OFFSET offsetof(ngx_http_conf_ctx_t, loc_conf)
示例:
static ngx_command_t ngx_http_print_commands[] = {
{
ngx_string("print"),
NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,
ngx_http_print_setup,
//set(),会转化读入指令传进来的参数,并将合适的值保存到配置结构体
NGX_HTTP_LOC_CONF_OFFSET,
offsetof(ngx_http_print_loc_conf_t, ed),
NULL
},
ngx_null_command
};
5、常用函数
5.1 处理Request
ngx_http_get_module_main_conf
函数功能:根据request请求和模块得到main配置。
#define ngx_http_get_module_main_conf(r, module) \
(r)->main_conf[module.ctx_index]
ngx_http_get_module_srv_conf
函数功能:根据request请求和模块得到server配置。
#define ngx_http_get_module_srv_conf(r, module) (r)->srv_conf[module.ctx_index]
ngx_http_get_module_loc_conf
函数功能:根据request请求和模块得到location配置。
#define ngx_http_get_module_loc_conf(r, module) (r)->loc_conf[module.ctx_index]
5.2 解析conf
ngx_http_conf_get_module_main_conf
函数功能:根据conf结构和模块得到main配置。
#define ngx_http_conf_get_module_main_conf(cf, module) \
((ngx_http_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index]
ngx_http_conf_get_module_srv_conf
函数功能:根据conf结构和模块得到server配置。
#define ngx_http_conf_get_module_srv_conf(cf, module) \
((ngx_http_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index]
ngx_http_conf_get_module_loc_conf
函数功能:根据conf结构和模块得到location配置。
#define ngx_http_conf_get_module_loc_conf(cf, module) \
((ngx_http_conf_ctx_t *) cf->ctx)->loc_conf[module.ctx_index]
5.3 Cycle
ngx_http_cycle_get_module_main_conf
#define ngx_http_cycle_get_module_main_conf(cycle, module) \
(cycle->conf_ctx[ngx_http_module.index] ? \
((ngx_http_conf_ctx_t *) cycle->conf_ctx[ngx_http_module.index]) \
->main_conf[module.ctx_index]: \
NULL)
以上就介绍了nginx HTTP模块组成,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

DependencyInjection (DI) inphpenhancescodeflexabilityandtestabilitybydecouplingDependencyCreationFromusage.toImplementDieffectively: 1) UseIcontainersjudiciousytoavoavoidover-engineering.2) mengelakkan constructoLoadbylimitingdendenchreeorfour.3)

Toimproveyourphpwebsite'sperformance, usetheseStrategies: 1) pelaksanaanPodeCachingWithopcachetospeedupscriptinterpretation.2) OptimisedataBasequeriesqueriesSelectingOnlyNessaryFields.3)

Ya, itispossibletosendmassemailswithphp.1) uselibrarieshpmailerorswiftmailoreforefficientemailsending.2)

DependencyInjection (DI) inphpisadesignpatternTheevesinversionofControl (IOC) ByallowingdependencyestobeNectedIntoClasses, Enhancingmodularity, Testability, danFlexibility.DideDecouplassClassSesesesesSesesSesesSesesSesesSesesSesesspeciflementations, MakeCodemorAglementations, MakeCodemorAglementations, MakeCodemorAglementations, MakeCodemorAglementations, MakeCodemorAglementations, MakeCodemorAglementations, MakeCodemorAglementations, MakeCodemorAglementations, MakeCodemorAglemors, Maklumat

Cara terbaik untuk menghantar e -mel menggunakan PHP termasuk: 1. Gunakan fungsi mel () php untuk penghantaran asas; 2. Gunakan perpustakaan phpmailer untuk menghantar mel lebih kompleks HTML; 3. Gunakan perkhidmatan mel transaksional seperti SendGrid untuk meningkatkan keupayaan kebolehpercayaan dan analisis. Dengan kaedah ini, anda boleh memastikan bahawa e -mel bukan sahaja mencapai peti masuk, tetapi juga menarik penerima.

Mengira jumlah elemen dalam array multidimensi PHP boleh dilakukan dengan menggunakan kaedah rekursif atau berulang. 1. Kaedah rekursif dikira dengan melintasi array dan rekursif memproses susunan bersarang. 2. Kaedah berulang menggunakan timbunan untuk mensimulasikan rekursi untuk mengelakkan masalah kedalaman. 3. Fungsi Array_Walk_Recursive juga boleh dilaksanakan, tetapi ia memerlukan pengiraan manual.

Dalam PHP, ciri-ciri gelung do-sementara adalah untuk memastikan bahawa badan gelung dilaksanakan sekurang-kurangnya sekali, dan kemudian memutuskan sama ada untuk meneruskan gelung berdasarkan syarat-syarat. 1) Ia melaksanakan badan gelung sebelum pemeriksaan bersyarat, sesuai untuk senario di mana operasi perlu dilakukan sekurang -kurangnya sekali, seperti pengesahan input pengguna dan sistem menu. 2) Walau bagaimanapun, sintaks gelung do-sementara boleh menyebabkan kekeliruan di kalangan pemula dan boleh menambah overhead prestasi yang tidak perlu.

String hashing yang cekap dalam PHP boleh menggunakan kaedah berikut: 1. Gunakan fungsi MD5 untuk hashing cepat, tetapi tidak sesuai untuk penyimpanan kata laluan. 2. Gunakan fungsi SHA256 untuk meningkatkan keselamatan. 3. Gunakan fungsi password_hash untuk memproses kata laluan untuk menyediakan keselamatan dan kemudahan tertinggi.


Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

Video Face Swap
Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Artikel Panas

Alat panas

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Dreamweaver CS6
Alat pembangunan web visual

VSCode Windows 64-bit Muat Turun
Editor IDE percuma dan berkuasa yang dilancarkan oleh Microsoft

ZendStudio 13.5.1 Mac
Persekitaran pembangunan bersepadu PHP yang berkuasa
