友情提醒,想用perl来上传的兄弟可以打消这个念头了【附上测试代码】
在下在chinaunix贴了这个帖子,目前还没有得到解决,转到这里,看看能不能东方不亮西方亮吧。若能解决(包括但不限于被阁下直接解决,受阁下提示在下自行解决),重谢200分!
:-)
perl的垃圾回收机制简直是不堪忍受,undef根本释放不了内存
选perl来上传真是我最近做的最大的错误决定了。
本指望mod_perl会有效提高处理的并发数量,没成想一会儿内存就到90%了。
还望有意采用perl上传的兄弟引以为戒啊。
看来我得把它改为PHP的了,唉。
由于我对perl的了解不深,如果我说的有错误,还请指教。
系统 Linux cent os
perl版本 5.8.5
CGI版本
$CGI::revision = '$Id: CGI.pm,v 1.227 2007/02/23 23:03:16 lstein Exp $ ';
$CGI::VERSION= '3.27 ';
附上代码
upload.html
<HTML>
<HEAD>
<TITLE> upload </TITLE>
</HEAD>
<BODY>
<form enctype= "multipart/form-data " method= "post " action= "http://localhost/perl/upload2.cgi ">
<input type= "file " name= "uploadname " />
<input type= "submit " value= "submit " />
</form>
</BODY>
</HTML>
upload2.cgi
BEGIN{
$ENV{TMPDIR} = $ENV{DOCUMENT_ROOT}. "/uploading "; #设置上传中的临时目录,此目录需每日清理
}
#use mydebug;
#printEnv();
#use CGI::Carp 'fatalsToBrowser ';
#use Data::Dumper;
my ($cwd) = ($ENV{SCRIPT_FILENAME} =~ m!^(.+)/.*?$!);
chdir $cwd;
use strict;
use CGI;
use CGI qw/:standard/;
$CGI::POST_MAX = 1024 * 1024 * 300; # max 300MB posts
if($ENV{REQUEST_METHOD} =~ /post/i)
{
process_upload();
}
else
{
fatal_error( "Error Request ");
}
sub fatal_error
{
close(STDIN);
print "Content-type: text/html;charset=gbk\n\n ";
print "发生错误: ".shift(@_);
print " <a href= ' ".$ENV{HTTP_REFERER}. " '> 返回 </a> ";
exit 0;
}
sub process_upload()
{
my $query = CGI-> new();
my $upload_filehandle = $query-> upload( 'uploadname ');
undef $upload_filehandle;
undef $query;
fatal_error( "上传完毕 " );
}
#__END__;
[解决办法]
加上 close $upload_filehandle 如何?
mod_perl不行的话,能否换成fastcgi ?我以前用过fastcgi,不过没有使用CGI模块.完全自己解析HTTP的,所以没有遇到内存问题.