2009-07-30 10 views
4

Ich betreiben CGI-Skript mit apache2 und ich habe diese Warnung Linien in error.log ( entfernte ich alle ähnlichen Zeilen aus dem Ausgang):Warum bekomme ich Warnungen unter "Benutze Konstante" unter mod_perl "neu definieren"?

 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::UPLOAD_DIR redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::BUFFER_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::BUFFER_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_FILE_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_FILE_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_DIR_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_DIR_SIZE redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_OPEN_TRIES redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 
[Thu Jul 30 09:39:37 2009] upload.pl: Constant subroutine ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::MAX_OPEN_TRIES redefined at /usr/share/perl/5.10/constant.pm line 115, line 133. 
Subroutine dir_size redefined at /home/stanislav/cgi/perl/upload.pl line 79, 
    line 133 (#2) 
[Thu Jul 30 09:39:37 2009] upload.pl: Subroutine dir_size redefined at /home/stanislav/cgi/perl/upload.pl line 79, line 133. 
Subroutine error redefined at /home/stanislav/cgi/perl/upload.pl line 90, 
    line 133 (#2) 
[Thu Jul 30 09:39:37 2009] upload.pl: Subroutine error redefined at /home/stanislav/cgi/perl/upload.pl line 90, line 133. 
Argument "" isn't numeric in numeric ge (>=) at 
    /home/stanislav/cgi/perl/upload.pl line 62 (#4) 
[Thu Jul 30 09:39:37 2009] -e: Argument "" isn't numeric in numeric ge (>=) at /home/stanislav/cgi/perl/upload.pl line 62. 
Filehandle OUTPUT opened only for input at /home/stanislav/cgi/perl/upload.pl 
    line 69 (#5) 
[Thu Jul 30 09:39:37 2009] -e: Filehandle OUTPUT opened only for input at /home/stanislav/cgi/perl/upload.pl line 69. 
Constant subroutine 
    ModPerl::ROOT::ModPerl::Registry::home_stanislav_cgi_perl_upload_2epl::UPLOAD_DIR redefined at /usr/share/perl/5.10/constant.pm line 115, line 133 (#1) 

Warum diese Linien gibt es und gibt es einen Weg zu stoppen Sie?

Code, der diese Warnungen macht (aus dem Buch "CGI-Programmierung mit Perl" genommen, mit einigen Fehler behoben):



#!/usr/bin/perl 
use strict; 
use warnings; 


use CGI; 
use CGI::Carp; 
#use diagnostics qw/-verbose/; 

use Fcntl qw(:DEFAULT :flock); 
use constant UPLOAD_DIR  => "/tmp/test_upload/"; 
use constant BUFFER_SIZE => 16_384; 
use constant MAX_FILE_SIZE => 1_048_576;  # Limit each upload to 1 MB 
use constant MAX_DIR_SIZE => 100 * 1_048_576; # Limit total uploads to 100 MB 
use constant MAX_OPEN_TRIES => 100; 

$CGI::DISABLE_UPLOADS = 0; 
$CGI::POST_MAX   = MAX_FILE_SIZE; 
my $q = new CGI; 
$q->cgi_error and error($q, "Error transferring file: " . $q->cgi_error); 
my $file  = $q->param("file")  || error($q, "No file received."); 
my $filename = $q->param("filename") || error($q, "No filename entered."); 
my $fh  = $q->upload("file")  || error($q, "Something is wrong with file handle."); 
#my $fh  = $q->upload($file); 
my $buffer = ""; 
if (dir_size(UPLOAD_DIR) + $ENV{CONTENT_LENGTH} > MAX_DIR_SIZE) { 
    error($q, "Upload directory is full."); 
} 
# Allow letters, digits, periods, underscores, dashes 
# Convert anything else to an underscore 
$filename =~ s/[^\w.-]/_/g; 
if ($filename =~ /^(\w[\w.-]*)/) { 
    $filename = $1; 
} 
else { 
    error($q, "Invalid file name; files must start with a letter or number."); 
} 
# Open output file, making sure the name is unique 
until (sysopen OUTPUT, UPLOAD_DIR . $filename, O_CREAT | O_EXCL) { 
    $filename =~ s/(\d*)(\.\w+)$/($1||0) + 1 . $2/e; 
    $1 >= MAX_OPEN_TRIES and error($q, "Unable to save your file."); 
} 
# This is necessary for non-Unix systems; does nothing on Unix 
binmode $fh; 
binmode OUTPUT; 
# Write contents to output file 
while (read($fh, $buffer, BUFFER_SIZE)) { 
    print OUTPUT $buffer; 
} 
close OUTPUT; 

if (-T $fh) { 
    print $q->header("text/plain"); 
    seek $fh, 0, 0; 
    map { print } ; 
} 

sub dir_size { 
    my $dir = shift; 
    my $dir_size = 0; 

    # Loop through files and sum the sizes; doesn't descend down subdirs 
    opendir DIR, $dir or die "Unable to open $dir: $!"; 
    while ($_ = readdir DIR) { 
     $dir_size += -s "$dir/$_"; 
    } 
    return $dir_size; 
} 
sub error { 
    my($q, $reason) = @_; 

    print $q->header("text/html"), 
      $q->start_html("Error"), 
      $q->h1("Error"), 
      $q->p("Your upload was not procesed because the following error ", 
       "occured: "), 
      $q->p($q->i($reason)), 
      $q->end_html; 
    exit; 
} 

Dieser Code haben ähnliche Ausgabe: $ perl -e 'sub FOO() { 1 } BEGIN{ *FOO = sub() { 2 }; } print FOO;'

Constant subroutine main::FOO redefined at -e line 1.

I did put no warnings qw/redefine/ aber es hat nicht geholfen.

Antwort

5

AFAIK, erhalten Sie nur diese Warnungen, wenn Sie Ihr Skript ändern und dann das Skript neu kompiliert von mod_perl für Unterprogramme, die für inlining geeignet sind. Wenn die Subroutine neu kompiliert wird, wird der neue Wert nicht an den Stellen reflektiert, an denen sie zuvor inline war. Wenn Sie den Wert von, sagen wir BUFFER_SIZE ändern, sollten Sie apache erneut starten.

Ich denke auch mod_perl/Apache::Registry accidental closures ist relevant für Ihr Skript.

1

Bei einer Schätzung wird die erste Definition von FOO weg optimiert. Definieren Sie es mit einer Aussage im Körper und ich denke, Sie werden feststellen, dass der Fehler verschwindet.

$ perl -e 'sub FOO() { print 1; } BEGIN{ *FOO = sub() { 2 }; } print FOO;'