Сценарий Perl / CGI не выполняется при больших загрузках - PullRequest
2 голосов
/ 22 ноября 2011

У меня есть этот Perl / CGI для загрузки файлов и получения размера загруженного файла во время загрузки.

Сценарий отлично работает для файлов размером менее 500 МБ, но буфер (OUTFILE) прекращает запись файла после примерно 500 МБ. Вот частичный код:

$u_size = $ENV{'CONTENT_LENGTH'};
if ($u_size > $max_size) {send_error ("Upload too big.  Maximum size is $max_size bytes and your file is $u_size bytes.");}

print_progress(0);
# Set up uploading function
$query = CGI->new(\&hook);

#define functions
sub hook  {
    if ($error) {return;}
    if (time >= $next_print) {
        $next_print = time + $delay;
        my ($filename, $buffer, $bytes_read, $data) = @_;
        if ($check_mime) {
            $filename =~ m/\.([^\.]+)$/;
            $ext = lc($1);
            print $ext;
            $check_mime = 0;
        }
        $percent = $bytes_read / $u_size;
        $filename =~ m/\\([^\\]+)$/;
        $filename = $1;
        print_progress($percent, $u_size, $bytes_read, $filename);
    }
}

sub print_progress {
    open(PROG, '>'.$uploaded_file_progress);
    print PROG '{"percent" : ' . ($_[0] * 100) . ', "total" : ' . $_[1] . ', "uploaded" : ' . $_[2] . ', "filename" : "' . $_[3] . '"}';
    close PROG;
}

#############

$uphandle = $query->upload($query->param());
binmode $uphandle;

if (!$error) {
    open OUTFILE, ">" . $uploaded_file;
    binmode OUTFILE;
    while($bytesread = read $uphandle, $buffer, 1024) {
      print OUTFILE $buffer;
    }
    #while (<$uphandle>) {print OUTFILE $_;}
    close OUTFILE;
}

Если сценарий не является проблемой, что еще нужно проверить? Спасибо.

Редактировать: У меня есть в журнале: время ожидания для выхода из сценария CGI. Как мне избавиться от этого? Я не смог найти точный ответ в Google.

Ответы [ 3 ]

2 голосов
/ 22 ноября 2011

Я бы подумал, что вам нужно указать свою конфигурационную переменную apache TimeOut в apache conf.

Поскольку вы используете perl, это пару раз обсуждалось на perlmonks.org и по этой ссылкевыскочил в ответ.

http://www.stonehenge.com/merlyn/LinuxMag/col39.html

1 голос
/ 22 ноября 2011

Возможно, вы захотите установить для $ CGI :: POSTMAX значение, превышающее 500 МБ, чтобы посмотреть, исправит ли это проблему.

Если я не ошибаюсь, для POSTMAX по умолчанию используется 500 МБ.Я всегда устанавливаю 2 ГБ (но потом использую его для загрузки большого количества видео!)

0 голосов
/ 22 ноября 2011

Существует параметр Apache httpd.conf 'MaxRequestLen', который стоит изучить (если вы используете Apache).

...