Beefy Boxes and Bandwidth Generously Provided by pair Networks
go ahead... be a heretic

Re^5: source filtering and mod_perl2

by Corion (Patriarch)
on Aug 29, 2011 at 08:36 UTC ( [id://922952]=note: print w/replies, xml ) Need Help??

in reply to Re^4: source filtering and mod_perl2
in thread source filtering and mod_perl2

Looking at (the source of) Apache::PerlRun, it basically is:

my %orig_inc = %INC; my $eval = join '', 'package ', $package, ';use Apache qw(exit);', $line, $$code, "\n"; $rc = $pr->compile(\$eval);

... and as $code gets loaded by a plain file read, source filters never get the chance to actually modify the code.

You could maybe use a two-level scheme of having the first code be a wrapper that loads your to-be-filtered code. Personally, I would look instead at Plack/PSGI, which eliminates much of the middle man and should work with source filters. When it comes to deploying, source filters also should still work, and if not, you can always use Apache as a transparent proxy in front of your plack application.

Replies are listed 'Best First'.
Re^6: source filtering and mod_perl2
by Logicus (Initiate) on Aug 29, 2011 at 13:44 UTC
    Just wrote the following; need to work on it more but it's starting to look good and it's hella' fast. I need to get this plack thing figured out so I can stick them together.
    listing of /var/www/ -------------------- #!/usr/bin/perl use Modern::Perl; use aXML2; our $stash = { site_title => "bob's bit'z emporium" }; our $bob = "scalars"; my $ctr; sub test { $ctr++; "run $ctr"; } $_ = qq` <aXML> <head> <title>[stash]->{'site_title'}[/]</title> </head> <body> <h1>[stash]->{'site_title'}[/]</h1> (test)(/)<br/> (test)(/) () bracket commands don't cache and <br/> (test)(/) run every time they are called <br/> <test></><br/> <test></> <> bracket commands do cache and retain<br/> <test></> their value once computed <br/> [aXML_cache]->{'test'}[/] <br><br> [] bracket commands interpolate values<br/> in [bob][/] and hashrefs<br/> <br><p> believe it or not just those tags are all you need template<br/> wise. Logic should be in modules, not the templates!</p> <p>aXML2 is far less expressive than aXML, but far faster.<br/> The aXML code gets filtered into raw perl commands then <br/> compiled and executed by Eval::Compile resulting in<br/> performance not far short of executing plain perl.</p> <p>One notable loss for the sake of performance is the<br/> ability to build complex declarations from groups of<br/> simple ones. I am hoping to bring some of that flexibility<br/> back as I work on the filter more. Since the code is only<br/> filtered once on the child process startup, performance<br/> should remain high.</p> (aXML::Bench::EndReport)(/) </body> </aXML> `;aXML2; Listing of /etc/perl/ ------------------- use Modern::Perl; use Eval::Compile qw ( ceval ); use aXML::Bench; our $cache; sub aXML2 { local $_ = $_[0] ||= $_; &aXML::Bench::Start(); s/@/\@/gs; s@<aXML>@print qq`Content-type: text\/html\n\n<html>@gs; s@<\/aXML>@<\/html>`;@gs; s@\(([^\(]+?)\)([^\(]*?)\(\/\)@`; print &$1($2); print qq`@gs; s@\[([^\[]+?)\]([^\[]*?)\[\/\]@\$$1$2@gs; s@<perl>@\@;@s; s@</perl>@print qq\@@s; s@<([^<]+?)>([^<]*?)</>@`; \$aXML_cache->{'$1'} = &$1('$2') unless \$aXML_cache->{'$1'}; print \$aXML_cache->{'$1'}; print qq`@gs; ceval $_; } 1; Listing of /etc/perl/aXML/ ------------------------ package aXML::Bench; use Modern::Perl; use Time::HiRes qw ( gettimeofday tv_interval ); my ($start,$end,$elapsed,$fps); sub MileStone { End(); my $report=Report(); Start(); return $report;} sub EndReport { End(); return Report(); } sub Start { $start = [ gettimeofday ]; return ""; } sub End { $end = [ gettimeofday ]; return ""; } sub Report { $end = [ gettimeofday ]; $elapsed = tv_interval($start,$end); $fps = int(1 / $elapsed); return "$elapsed = $fps p/s"; } 1;

Log In?

What's my password?
Create A New User
Domain Nodelet?
Node Status?
node history
Node Type: note [id://922952]
and the web crawler heard nothing...

How do I use this?Last hourOther CB clients
Other Users?
Others sharing their wisdom with the Monastery: (3)
As of 2024-04-21 18:36 GMT
Find Nodes?
    Voting Booth?

    No recent polls found