Fenng的站点关掉了留言的验证码(SCode插件)功能, 居说是因为这个功能占用了太多的资源, 导致了主机的负荷比较高, 不过这样之后不知道他是如何来挡垃圾留言了. 听到这个消息后, 我花了一个小时改了这么一点Perl程序, 因为我不懂Perl. 主要的改进是原来的SCode插件每次访问都要调用图形库函数, 去重新生成验证码的图片, 而我的改进之中是将这些图片保存起来, 这样的话下次访问时就直接从文件中读了, 而不会调用图形库了.

    以我的网站的流量, 是看不到改进的效果的, 因此希望有人去测试一下.

    对SCode.pm文件的改进, 增加了一个函数, 另外限制了生成的验证码的范围为1000-5000, 如下所示:

###########################
#                        #
# Do not modify from here #
#                        #
###########################
sub scode_tmpdir {
    return $tmpdir;
}

if ($code>0 && $code<=$scode_maxtmp)
{
    $scode = 1000 + ($scode % 4000);
    open(OUTFILE,">${tmpdir}${code}");
    print OUTFILE $scode;
    close(OUTFILE);
}

    对mt-scode.cgi的改进, 如果文件不存在就保存到文件, 否则直接从文件中读取, 主要改进如下:


my($MT_DIR);
my($imgfile);
......
# Calculate code
$scode = MT::SCode::scode_get($code);
$imgfile = MT::SCode::scode_tmpdir()."imgcache/temp".$scode.".png";
......
if (-e $imgfile)
{
  binmode STDOUT;
  open IMGOUT, "<".$imgfile;
  print $cgi->header(-type=>'image/png',-cookie=>$cookie);
  print <IMGOUT>;
  close IMGOUT;
}
else
{
  ......
  # Output the image
  binmode STDOUT;
  print $cgi->header(-type=>'image/png');
  print $im->png;
 
  open IMGOUT, ">".$imgfile;
  binmode IMGOUT;
  print $cgi->header(-type=>'image/png',-cookie=>$cookie);
  print IMGOUT $im->png;
  close IMGOUT;
}

    希望我这样的改动是有用的, 有人愿意试试吗?