Perché ottengo & # 8220; ridefinisci & # 8221; avvisi con & # 8220; usa la costante & # 8221; sotto mod_perl?
Domanda
Eseguo lo script CGI con apache2 e ho queste righe di avviso in error.log ( Ho rimosso tutte le righe simili dall'output ):
[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)
Perché ci sono queste linee ed esiste un modo per fermarle?
Codice che emette questo avviso (tratto dal libro "Programmazione CGI con Perl", con alcuni bug corretti):
#!/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 ( Eseguo lo script CGI con apache2 e ho queste righe di avviso in error.log ( Ho rimosso tutte le righe simili dall'output ):
[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)
Perché ci sono queste linee ed esiste un modo per fermarle?
Codice che emette questo avviso (tratto dal libro "Programmazione CGI con Perl", con alcuni
bug corretti):
Constant subroutine main::FOO redefined at -e line 1.
Questo codice ha un output simile:
$ perl -e 'sub FOO () {1} INIZIA {* FOO = sub () {2}; } print FOO; '
<*>
Non ho inserito avvisi qw / redefine /
ma non ha aiutato.
= readdir DIR ) {
$dir_size += -s "$dir/ Eseguo lo script CGI con apache2 e ho queste righe di avviso in error.log ( Ho rimosso tutte le righe simili dall'output ):
[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)
Perché ci sono queste linee ed esiste un modo per fermarle?
Codice che emette questo avviso (tratto dal libro "Programmazione CGI con Perl", con alcuni
bug corretti):
<*>
Questo codice ha un output simile:
$ perl -e 'sub FOO () {1} INIZIA {* FOO = sub () {2}; } print FOO; '
<*>
Non ho inserito avvisi qw / redefine /
ma non ha aiutato.
";
}
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;
}
Questo codice ha un output simile:
$ perl -e 'sub FOO () {1} INIZIA {* FOO = sub () {2}; } print FOO; '
<*>
Non ho inserito avvisi qw / redefine /
ma non ha aiutato.
Soluzione
AFAIK, ricevi questi avvisi solo quando modifichi lo script e quindi lo script viene ricompilato da mod_perl
per le subroutine che possono essere inserite. Quando la subroutine viene ricompilata, se il valore che restituisce è cambiato, quel nuovo valore non si rifletterebbe nei punti in cui era precedentemente inline.
Se si modifica il valore di, ad esempio, BUFFER_SIZE
, è necessario riavviare apache
.
Penso anche che mod_perl / Apache :: Chiusure accidentali del registro è rilevante per la tua sceneggiatura.
Altri suggerimenti
A indovinare, la prima definizione di FOO è stata ottimizzata. Definiscilo con una dichiarazione nel corpo e penso che scoprirai che l'errore scompare.
$ perl -e 'sub FOO () {stampa 1; } INIZIA {* FOO = sub () {2}; } stampa FOO; '