我这有段解压缩代码,自己定义要解压的值和长度就可以:不知如何在HttpSRCacheModule赋值进去?
int err;
Byte compr[200], uncompr[200]; // big enough
uLong comprLen, uncomprLen;
const char* hello = "123456789";
uLong len = strlen(hello) + 1;
comprLen = sizeof(compr) / sizeof(compr[0]);
err = compress(compr, &comprLen, (const Bytef*)hello, len);
printf("%s\n",compr);
if (err != Z_OK) {
printf("compess error: %d\n", err);
exit(1);
}
printf("orignal size: %d\n" ,len);
printf("compressed size : %d\n",comprLen);
strcpy((char*)uncompr, "garbage");
uncomprLen = len*1.2;
err = uncompress(uncompr, &uncomprLen, compr, comprLen);
printf ("%d\n",err);
if (err != Z_OK) {
printf("uncompess error: %d\n" , err);
exit(1);
}
printf("orignal size:%d\n ",len );
printf("uncompressed size : %d\n", uncomprLen);
if (strcmp((char*)uncompr, hello)) {
printf("BAD uncompress!!!\n");
exit(1);
} else {
printf("uncompress() succeed: %s\n" , (char *)uncompr);
}
------------------ Original ------------------
Date: Mon, Mar 26, 2012 05:20 PM
To: "生活在别处"<lys...@qq.com>;
Cc: "openresty"<openresty@googlegroups.com>;
Subject: Re: HttpSRCacheModule源码修改问题
On Mon, Mar 26, 2012 at 5:07 PM, 生活在别处
<lys...@qq.com> wrote:
您好!之前我一直在使用httpredis这个插件来通过nginx操作redis的数据,但是httpredis不支持解压缩,只能以无压缩方式把数据存入redis,然后通过nginx+redis插件读取内容。这样带来的一个问题就是需要非常大的内容来支持redis的存储。后来我想了个办法,抛弃httpredis,通过nginx+fcgi操作redis数据,fcgi脚本将redis的内容解压缩,这样就可以压缩数据存进redis了。同样的内容,占用内存空间,压缩是不压缩1/5。但这样有个致命的缺点,就是nginx+fcgi并发数很低。
无意中,拜读了您的HttpSRCacheModule,发现redis通过它可以操作redis。眼前亮光光:可否修改HttpSRCacheModule源码添加解压缩命令,将从redis获取的数据解压缩后返回给nginx(用户)?但我找了好久都没找到在代码哪里添加解压缩代码?在此盼望您指点迷津。小弟非常感谢章老师的指导和作品。
gzip 压缩和解压缩支持一直是 ngx_srcache 模块的一项 TODO :)
srcache_fetch 的 gzip 解压功能可以添加在 src/ngx_http_srcache_store.c 文件中的 ngx_http_srcache_body_filter 函数中,即将数据放入 ctx->body_from_cache 链表之前进行解压。
同时 srcache_store 的 gzip 压缩功能也是在同样的 C 函数中添加,即在它把数据放入 ctx->body_to_cache 链表之前进行压缩操作。
欢迎为 ngx_srcache 模块贡献解压缩以及压缩的功能支持 :)
Thanks!
-agentzh
P.S. 因为不涉及敏感信息,所以我将此邮件同时抄送给了 openresty 邮件组,这样整个团队以及其他用户都可以看到这里的讨论 :)