Nginx 基本数据结构.pdfVIP

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Nginx 基本数据结构.pdf

Nginx 基本数据结构 基本数据结构 Nginx 的作者为追求极致的⾼效,⾃⼰实现了很多颇具特⾊的 Nginx 风格的数据结构 以及公 函数。⽐如,Nginx 提供了带长度的字符串,根据编译器选项优化过的字符 串拷贝函数 ngx_copy 等。所以,在我们写 Nginx 模块时,应该尽量调⽤ Nginx 提供 的 api ,尽管有些 api 只是对 glibc 的宏定义。本节,我们介绍 string、list 、buffer 、 chain 等⼀系列最基本的数据结构及相关api的使⽤技巧以及注意事项。 ngx_str_t 在 Nginx 源码⽬录的 src/core 下⾯的 ngx_string.h|c ⾥⾯,包含了字符串的封装 以及字符串相关操作的 api 。Nginx 提供了⼀个带长度的字符串结构 ngx_str_t ,它的原 型如下: typedef struct { size_t len; u_char *data; } ngx_str_t; 在结构体当中,data 指向字符串数据的第⼀个字符,字符串的结束⽤长度来表⽰,⽽ 不是由\\0来表⽰结束。所以,在写 Nginx 代码时,处理字符串的⽅法跟我们平时 使⽤有很⼤的不⼀样,但要时刻记住,字符串不以\\0结束,尽量使⽤ Nginx 提供 的字符串操作的 api 来操作字符串。 那么,Nginx 这样做有什么好处呢?⾸先,通过长度来表⽰字符串长度,减少计算字 符串长度的次数。其次,Nginx 可以重复引⽤⼀段字符串内存,data 可以指向任意内 存,长度表⽰结束,⽽不⽤去 copy ⼀份⾃⼰的字符串( 因为如果要以\\0结束,⽽ 不能更改原字符串,所以势必要 copy ⼀段字符串) 。我们在 ngx_http_request_t 结构体 的成员中,可以找到很多字符串引⽤⼀段内存的例⼦,⽐如 request_line 、uri、args 等 等,这些字符串的 data 部分,都是指向在接收数据时创建 buffer 所指向的内存中, uri ,args 就没有必要 copy ⼀份出来。这样的话,减少了很多不必要的内存分配与拷 贝。 正是基于此特性,在 Nginx 中,必须谨慎的去修改⼀个字符串。在修改字符串时需要 认真的去考虑:是否可以修改该字符串;字符串修改后,是否会对其它的引⽤造成影 响。在后⾯介绍 ngx_unescape_uri 函数的时候,就会看到这⼀点。但是,使⽤ Nginx 的字符串会产⽣⼀些问题,glibc 提供的很多系统 api 函数⼤多是通过\\0来表⽰字 符串的结束,所以我们在调⽤系统 api 时,就不能直接传⼊ str-data 了。此时,通常 的做法是创建⼀段 str-len + 1 ⼤⼩的内存,然后 copy 字符串,最后⼀个字节置 为\\0。⽐较 hack 的做法是,将字符串最后⼀个字符的后⼀个字符 backup ⼀个, 然后设置为\\0,在做完调⽤后,再由 backup 改回来,但前提条件是,你得确定 这个字符是可以修改的,⽽且是有内存分配,不会越界,但⼀般不建议这么做。接下 来,看看 Nginx 提供的操作字符串相关的 api 。 #define ngx_string(str { sizeof(str - 1, (u_char * str ngx_string(str) 是⼀个宏,它通过⼀个以\\0结尾的普通字符串 str 构造⼀个 Nginx 的字符串,鉴于其中采⽤ si eof 操作符计算字符串长度,因此参数必须是⼀个常量字 符串。 #define ngx_null_string { 0, NULL } 定义变量时,使⽤ ngx_null_string 初始化字符串为空字符串,符串的长度为 0 ,data 为 NULL 。 #define ngx_str_set(str, text (str -len = sizeof(text - 1; (str -data = (u_char * t ngx_str_set ⽤于设置字符串 str 为 text ,由于使⽤ si eof 计算长度,故 text 必须为常量 字符串。 #define ngx_str_null(str (str -len = 0; (str -data = NUL n

您可能关注的文档

文档评论(0)

zhoubingchina + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档