我后来debug了一下,发现问题出在我的value里面有'&'字符(value是一段二进制流,里面有什么 都有可能)
ngx_str_t params;
//cmd=set&key=dog&val=animal&flags=1234&exptime=2
在拼接subrequest的params时,用ngx_escape_uri对value进行处理了一下,escape type用NGX_ESCAPE_ARGS
然后在nginx conf中
set_unescape_uri $memc_value $arg_val;
最后解决了。
谢谢春哥
------------------ Original ------------------
Sender: "agentzh"<age...@gmail.com>;
Send time: Thursday, Jan 31, 2013 3:12 PM
To: "Collin/hug"<413...@qq.com>;
Cc: "openresty"<openresty@googlegroups.com>;
Subject: Re: nginx subrequest写cache的问题
Hello!
2013/1/30 Collin/hug:
>
> 我的模块大致是这样的,handler中处理生成一个长约15k的数据块,然后调用
> ngx_http_subrequest将数据块写到memcache中,从返回看subrequest成功了。
> 然后我拿key去取数据块的时候发现返回的长度很只有set的前面一小部分。
你使用 ngx_echo 模块或者 ngx_lua 模块的子请求接口访问 ngx_memc 能复现此问题么?我觉得很可能是你自己写的
nginx C 模块本身有问题。
> 我不知道是不是memc模块是不是以\0作为判断value的结束?
>
当然不会 :)
ngx_memc 模块的测试集中有一个用例专门测试了 value 中含有 \0 的情形:
https://github.com/agentzh/memc-nginx-module/blob/master/t/storage.t#L718
这个用例使用 ngx_echo 模块来发起到 ngx_memc 的子请求。
同时抄送给 openresty 中文邮件列表:http://openresty.org/#Community
我也希望你能加入此列表讨论这样的问题,谢谢合作 :)
Regards,
-agentzh