2009-07-30 5 views
4

J'exécuter le script CGI avec apache2 et j'ai ces lignes d'avertissement dans error.log ( j'ai enlevé toutes les lignes similaires de la sortie):Pourquoi est-ce que je reçois des avertissements "redéfinir" avec "use constant" sous mod_perl?

 
[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) 

Pourquoi ces lignes sont là et est-il un moyen d'arrêter leur?

code qui rend cet avertissement (extrait du livre de "programmation CGI avec Perl", avec quelques bugs fixes):



#!/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; 
} 

Ce code ont une sortie similaire: $ 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/ mais il n'a pas aidé.

Répondre

5

AFAIK, vous obtenez seulement ces avertissements lorsque vous modifiez votre script et le script est recompilé par mod_perl pour des fonctions qui seront inlining. Lorsque la sous-routine est recompilée, si la valeur qu'elle renvoie est modifiée, cette nouvelle valeur ne sera pas reflétée dans les emplacements où elle était précédemment insérée. Si vous modifiez la valeur de BUFFER_SIZE par exemple, vous devez redémarrer apache. Je pense aussi mod_perl/Apache::Registry accidental closures est pertinent pour votre script.

1

À première vue, la première définition de FOO est optimisée. Définissez-le avec une déclaration dans le corps et je pense que vous trouverez l'erreur disparaît.

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

Questions connexes