Perl CGI Hook не работает должным образом - PullRequest
0 голосов
/ 12 ноября 2009

У меня проблемы с использованием perl cgi hook.

Похоже, что после того, как я нажал кнопку "отправить", мой Perl-скрипт вызывается не так, как после загрузки файла полностью.

Это может быть связано с настройкой сервера.

Кто-нибудь сталкивался с этой проблемой раньше?

Обновление:

Причина была предустановлена: Модуль безопасности Apache

Спасибо за ваше время.


Исходный код Perl

#!/usr/bin/perl -w

use CGI::Carp 'fatalsToBrowser';
use CGI qw(:cgi);
use IO::File;
use strict;

my $hook_file = "test.txt";

my $hook_handle = new IO::File;
$hook_handle->open(">> $hook_file") or die("Failed to open $hook_file: $!");

my $hook_query = CGI->new(\&hook, $hook_handle);

#start upload:
my $query = new CGI;

sub hook{
    my ($current_filename, $buffer, $bytes_read, $hook_handle) = @_;

    $hook_handle->print( join(" ",times()) . " -> " . $bytes_read ."\n" );
}



print "Content-type: text/html\n\n";


1;

Для отслеживания процесса загрузки я использую tail:

touch test.txt
tail -f test.txt

Используя простую форму HTML POST, я начинаю загружать файл размером 5,5 МБ.

Вывод всегда похож:

system time / user time / cpu time   ->   bytes transfered

0.03 0 0 0 -> 4037
...
...
...
0.11 0.01 0 0 -> 5520894

Говоря, что загружено 5,5 МБ за 0,1 секунды.


Конфигурация сервера

Существует множество различий между конфигурациями:

use Config qw(myconfig config_sh config_vars);

print myconfig();

print config_sh();

Некоторые различия: (скажите, пожалуйста, что еще может быть интересным)

Первое значение - это рабочий сервер.

Второе значение имеет ошибка сервера мечты.

// dreamhost uses an older version of perl:
PERL_API_VERSION='10' -> '8'
api_versionstring='5.10.0' -> '5.8.0'

// dreamhost uses ByteLoader 
extensions='B ...'
extensions='B ByteLoader ...'

// dreamhost uses an older gcc version
gccversion='4.3.3' -> '4.1.2 20061115 (prerelease) (Debian 4.1.1-21)'

// dreamhost uses an older libc version
gnulibc_version='2.9' -> '2.3.6'

// the dreamhost server is using fast stdio
usefaststdio='undef' -> 'define'

CGI ( обновлено )

по совету Sinans я обновил свою версию CGI (однако это не решило мою проблему)

// dreamhost cgi version
print $query->version (); -> 3.48

1 Ответ

1 голос
/ 12 ноября 2009

У меня были некоторые трудности с печатью на файловый дескриптор, который передается на крючок, предположительно из-за проблем с буферизацией. Я решил использовать append_file из File::Slurp и передать имя файла журнала.

Я также решил обернуть скрипт в подпрограмму run на тот случай, если вы запустите его как скрипт реестра под mod_perl. Наконец, я не знаю, откуда взялась функция times(), поэтому я использовал time. Вот сценарий:

#!/usr/bin/perl

use strict; use warnings;

use CGI;
use File::Slurp;

run();

sub run {
    my $logfile = 'E:/srv/deploy/app/up.log';

    my $cgi = CGI->new(\&hook, $logfile);

    print $cgi->header('text/html'),
          $cgi->start_html,
          $cgi->p('Upload done'),
          $cgi->end_html;
    return;
}

sub hook {
    my ($filename, $buffer, $bytes_read, $logfile) = @_;
    append_file $logfile, \ sprintf("%d: %d\n", time, $bytes_read);
}

Выход:

1258030571: 4051
1258030571: 8102
1258030571: 12153
...
1258030574: 5959021
1258030574: 5963072
1258030574: 5963469

CGI версия: 3.37 версия apache: 2.2.4 (Windows) версия perl: 5.10.1 (ActiveState)

...