We had recompiled ePerl for 5.8.0 and mod_perl (1.27 and later 1.28)
statically linked with Apache with default options (does it include
threads?)

I'm using only Apache::ePerl which allows me use Perl in the the way
like
PHP, since I don't need Mason or EmbPerl html features for small WAP
resources.

It just does simple things parse & eval perl code saving it in global
$Cache hash. It use C code only for parsing eperl scripts
sourse. Switching off $Cache (adding if (1 || ..)) -- always compiling,
eliminate the
Cache bug. Something just mix key & value pairs in global hash shared by
httpd process,
after several requests. I just can't understand where the Apache::ePerl
bug can be --
it so simple and so clear module.. and it worked on older perl!
I will keep debuging, 

-vlad

where is all community? it's so silent in the conference. what the
language 
perl programmers migrated to? JSP, PHP? :(

=======

package Apache::ePerlWAP;


#   requirements and runtime behaviour
require 5.00325;
use strict;
use vars qw($VERSION);
use vars qw($nDone $nOk $nFail $Cache $Config);

#   imports
use Carp;
use Apache ();
use Apache::Debug;
use Apache::Constants qw(:common OPT_EXECCGI);
use FileHandle ();
use File::Basename qw(dirname);
use Parse::ePerl;
use lib '/usr/home/projects/lib';
use IMMO::Translit qw(:all); # to translit or utf8

#   private version number
$VERSION = do { my @v=("2.2.14"=~/\d+/g); sprintf "%d."."%02d"x$#v,@v };

#   globals
$nDone  = 0;
$nOk    = 0;
$nFail  = 0;
$Cache  = {};

...

#
#   the mod_perl handler
#
sub handler {
    my ($r) = @_;
    my ($filename, $data, $error, $fh);
    my (%env, $rc, $mtime, $owner, $size, $header, $key, $value, $path,
$xpath, $dir, $file, @S);

    #   statistic
    $nDone++;

...

    #   check cache for existing P-code
    #   ! added 1 || 
    if (not (    $Cache->{$filename}
             and $Cache->{$filename}->{CODE}
             and $Cache->{$filename}->{SIZE}  == $size
             and $Cache->{$filename}->{MTIME} == $mtime
             and $Cache->{$filename}->{OWNER} eq $owner)) {
        #   read script
        local ($/) = undef;
        $fh = new FileHandle $filename;
        $data = <$fh>;
        $fh->close;

        #   run the preprocessor over the script
        if (not Parse::ePerl::Preprocess({
            Script => $data,
            Cwd    => dirname($filename),
            Result => \$data
        })) {
            &send_errorpage($r, 'Error on preprocessing script', '');
            $nFail++;
            return OK;
        }

        #   translate the script from bristled
        #   ePerl format to plain Perl format
        if (not Parse::ePerl::Translate({
            Script          => $data,
            BeginDelimiter  => $Config->{'BeginDelimiter'},
            EndDelimiter    => $Config->{'EndDelimiter'},
            CaseDelimiters  => $Config->{'CaseDelimiters'},
            ConvertEntities => $Config->{'ConvertEntities'},
            Result          => \$data
        })) {
            &send_errorpage($r, 'Error on translating script from
bristled to plain format', '');
            $nFail++;
            return OK;
        }

        #   precompile the source into P-code
        $error = '';
        if (not Parse::ePerl::Precompile({
            Script => $data,
            Name   => $filename,
            Cwd    => dirname($filename),
            Result => \$data,
            Error  => \$error
        })) {
            &send_errorpage($r, 'Error on precompiling script from plain
format to P-code', $error);
            $nFail++;
            return OK;
        }

        #   set the new results
        $Cache->{$filename} = {};
        $Cache->{$filename}->{CODE}  = $data;
        $Cache->{$filename}->{SIZE}  = $size;
        $Cache->{$filename}->{MTIME} = $mtime;
        $Cache->{$filename}->{OWNER} = $owner;
    }

    #   retrieve precompiled script from cache
    $data = $Cache->{$filename}->{CODE};

    #   evaluate script
    if (not Parse::ePerl::Evaluate({
        Script  => $data,
        Name    => $filename,
        Cwd     => dirname($filename),
        ENV     => \%env,
        Result  => \$data,
        Error   => \$error
    })) {
        &send_errorpage($r, 'Error on evaluating script from P-code',
$error);
        $nFail++;
        return OK;
    }


> -----Original Message-----
> From: Perrin Harkins [mailto:[EMAIL PROTECTED] 
> Sent: Saturday, July 19, 2003 12:05 AM
> To: Влад Сафронов
> Cc: [EMAIL PROTECTED]
> Subject: Re: Need help, Global Hash corruption under mod_perl 
> in perl 5.8.0!?!
> 
> 
> On Fri, 2003-07-18 at 09:03, Влад Сафронов wrote:
> > I used Apache::ePerl ( http://www.ossp.org/pkg/tool/eperl/
> > <http://www.ossp.org/pkg/tool/eperl/> ) for a long time (up to perl
> > 5.6.1)
> > until our admin install perl 5.8.0 and recompiled apache 
> and mod_perl
> > with it.
> >  
> > After that global hash $Cache where all precompiled eperl 
> scripts kept
> > in becomes corrupted
> > (even under httpd -X) after several calls
> 
> Sounds like a bug in Apache::ePerl.
> 
> I'm afraid you'll find that ePerl isn't really being 
> supported by anyone
> at this point.  The last release was something like 5 years ago.  I'd
> suggest that you consider moving your code to one of the other
> templating systems available.  Meanwhile, you can try to debug
> Apache::ePerl with the usual methods.
> 
> Your admin did recompile ePerl with the new version of perl as well,
> didn't he?  And you are running mod_perl 1.x without threads?
> 
> - Perrin
> 
> 


  • ... Влад Сафронов
    • ... Perrin Harkins
    • ... Влад Сафронов
      • ... Perrin Harkins

Reply via email to