FCGI模式下$1引起的异常BUG分析
Webmail 通过FCGI模式的支持可以大幅提升页面的解析速度,但在FCGI下,很多平常看起来再正常不过的一些代码,都可能引起一些想不到的问题,用户反映相对集中的就是有些邮件转发时会显示源代码,经过一段时间的跟踪和分析,终于发现了是由于FCGI下持续化环境引起的$1等regexp匹配结果不能自动清零引起的。原因: FCGI持续化环境下$1等动态变量无法自动清零
[quote]
#!/usr/bin/perl -wT
print "content-type: text/html\n\n";
my $s = 'aa';
$s =~ m/(a)/;
print "\$1 => $1\n";
$s =~ m/(b)/;
print "\$1 => $1\n";
[/quote]
在dispatch.fcgi下执行此脚本,输出的结果是2个$1 => a 第二次无法匹配时$1保留的是上一次的匹配结果,
因此如果第二次引用$1时实际访问的是第一次(a)结果。这个情况在普通CGI模式下也存在,只是因为
cgi脚本执行方式不同,造成了$1在FCGI下默认有一个值(就是代码本身)。
正确的做法:
[quote]
#!/usr/bin/perl -wT
print "content-type: text/html\n\n";
my $s = 'aa';
if ($s =~ m/(a)/) {
print "\$1 => $1\n";
}
if ($s =~ m/(b)/) {
print "\$1 => $1\n";
}
[/quote]
此时只会输出一行$1 => a,如果$s='bb'则只输出一行$1 => b ,这里关键在于用if来判断是否匹配成功
然后再去访问$1,此时的$1就能保存正确匹配的结果。
对于类似:
[quote]
$s =~ s/(abc)/$1_efg/;
[/quote]
这样的regexp,则不存在上述的问题。因此,基于此原则,后期将针对这个问题对代码中涉及类似匹配的
地方进行处理,以避免这种语法上没错但隐藏着风险的代码问题。
回复 1# hzqbbc 的帖子
哈哈 我发现那个问题 终于找到原因啦 恩 赶快解决啊 :lol :lol怎么解决
楼主你好!我现在也遇到了这个问题!
十分期待您发布解决这个问题的版本! 最新版webmail已修复 写邮件里存在的这个问题.. 哪个版本?1.1.0 ? 最新版本是1.1.0,邮件转发 会出现代码的问题!
在1.1。0中没有更新吧!
楼主加油! Webmail 1.1.1 已包含修正,目前公布最新的1.1.0不含此修正,请多等些时日。
页:
[1]