Lightweight mod_perl Applications
            with Apache::Dispatch



            Fred Moyer
            fred@redhotpengu...
Apache::Dispatch
●   Abstraction layer for mod_perl applications
●   The power of mod_perl handlers
●   Maps URIs to appli...
Not another Framework
● There are plenty of those already
  ● OpenInteract

  ● Catalyst

  ● Jifty

  ● Axkit

  ● Woodst...
HTTP Request Lifecycle
Handles Response Phase


You are here
Start with URIs
 ●   /hello
 ●   /hello/world
 ●   /hello/world/oslo
 ●   /hello/oslo
 ●   hello/oslo/mongers
Map URIs to Method Handlers
●   Method handler passes package name as first
    argument, $r as second argument
●   /hello...
Apache::Test is your Friend
●   You do write your tests first, don't you? ;)
●   my/app/t/01hello.t =>
     use strict;
  ...
Configuration
my/app/t/conf/extra.last.conf.in =>

 PerlLoadModule    Apache2::Dispatch
 PerlLoadModule        My::Hello
 ...
Method Handlers
my/app/lib/My/Hello.pm =>
 package My::Hello;
 use strict;
 use Apache2::Const -compile => qw( OK );
 use ...
Apache::Test
my/app/Makefile.PL =>

 #!perl
 use strict;
 use warnings FATAL => 'all';
 use Apache::TestMM;
 Apache::TestM...
Apache::Test
my/app/t/TEST.PL =>

 #!perl
 use strict;
 use warnings FATAL => 'all';

 use Apache::TestRunPerl();

 Apache...
Hello!
           ● perl Makefile.PL
           ● make

           ● make test

           ● debug if errors

           ●...
Test me, Test me
Easily test with different httpd/mod_perl builds
●   export APACHE_TEST_HTTPD = /path/to/test_httpd/bin/h...
Review
●   Created a basic test driven
    Apache::Dispatch based hello
    web service

●   Wrote a test, a config file, ...
The Extras
●   Pre-Dispatch method handler

●   Post-Dispatch method handler

●   Custom Error method handler

●   Inherit...
Pre-Dispatch Method Handler
● DispatchExtras Pre
● Used for setup common to dispatch_* methods

● Similar functionality in...
Post-Dispatch Method Handler
● DispatchExtras Post
● Teardown for package dispatch_* methods

● As with pre_dispatch, simi...
Custom Error Method Handler
● DispatchExtras Error
● Handles error in dispatch_* methods

● Ignores errors in Pre/Post han...
Inheritance
●   DispatchISA My::BaseHandler
●   Useful for defining methods across
    different packages
●   For example,...
Autoloading
● DispatchAUTOLOAD On
● Autoloaded methos must be declared

●
  Read the camel book 3rd ed pp326-329
● Read th...
Filtering
● Use mod_perl2 filtering API for mp2
● Apache::Dispatch has built-in filtering for mp1



httpd.conf =>
Dispatc...
Lightweight
●   http://chamas.com/bench
    ●   658.7 req/sec for Apache::Dispatch
    ●   856.0 req/sec for mod_perl hand...
Dependencies
●   None unless you want to do testing
●   In which case you'll need
    ● Apache::Test

    ● LWP::UserAgent...
Credits

●   Geoffrey Young – Author, mod_perl
    and testing guru, helping me release
    the latest version soonish
●  ...
References
[1] - http://search.cpan.org/perldoc?Apache::Dispatch
[2] - mod_perl Developers Cookbook
    http://www.modperl...
Slides
These slides are freely available at

http://www.redhotpenguin.com/talks

Try out the latest version of Apache::Dis...
Upcoming SlideShare
Loading in...5
×

Apache Dispatch

1,569

Published on

The talk I gave on Apache::Dispatch at the Nordic Perl Workshop 2006 in Oslo, Norway.

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
1,569
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Apache Dispatch

  1. 1. Lightweight mod_perl Applications with Apache::Dispatch Fred Moyer fred@redhotpenguin.com
  2. 2. Apache::Dispatch ● Abstraction layer for mod_perl applications ● The power of mod_perl handlers ● Maps URIs to application resources via method handlers ● Painless migration from mod_perl handlers
  3. 3. Not another Framework ● There are plenty of those already ● OpenInteract ● Catalyst ● Jifty ● Axkit ● Woodstock ● ... ● Like CGI::Application in the sense that it's a library, but only for mod_perl ● MVC
  4. 4. HTTP Request Lifecycle
  5. 5. Handles Response Phase You are here
  6. 6. Start with URIs ● /hello ● /hello/world ● /hello/world/oslo ● /hello/oslo ● hello/oslo/mongers
  7. 7. Map URIs to Method Handlers ● Method handler passes package name as first argument, $r as second argument ● /hello => My::Hello->dispatch_index ● /hello/world => My::Hello->dispatch_world ● /hello/world/oslo => My::Hello::World->dispatch_oslo ● /hello/oslo => My::Oslo->dispatch_index ● /hello/oslo/mongers => My::Oslo->dispatch_mongers ● dispatch_index only works at the top level
  8. 8. Apache::Test is your Friend ● You do write your tests first, don't you? ;) ● my/app/t/01hello.t => use strict; use warnings FATAL => 'all'; use Apache::Test; use Apache::TestRequest; plan tests => 2; my $res = GET '/hello'; ok($res->code == 200); ok($res->content =~ m/Hello/i);
  9. 9. Configuration my/app/t/conf/extra.last.conf.in => PerlLoadModule Apache2::Dispatch PerlLoadModule My::Hello PerlLoadModule My::Hello::World DispatchRequire On DispatchUpperCase On <Location /hello> SetHandler modperl DispatchPrefix My::Hello PerlResponseHandler Apache2::Dispatch </Location>
  10. 10. Method Handlers my/app/lib/My/Hello.pm => package My::Hello; use strict; use Apache2::Const -compile => qw( OK ); use Apache2::RequestIO; use Apache2::RequestRec; sub dispatch_index { my $class = shift; my $r = shift; $r->content_type('text/plain'); $r->print(“Hello!”); return Apache2::Const::OK; }
  11. 11. Apache::Test my/app/Makefile.PL => #!perl use strict; use warnings FATAL => 'all'; use Apache::TestMM; Apache::TestMM->import(qw(test clean)); Apache::TestMM::filter_args(); Apache::TestMM::generate_script('t/TEST'); use ModPerl::MM; ModPerl::MM::WriteMakefile( %standard_make_params );
  12. 12. Apache::Test my/app/t/TEST.PL => #!perl use strict; use warnings FATAL => 'all'; use Apache::TestRunPerl(); Apache::TestRunPerl->new->run(@ARGV);
  13. 13. Hello! ● perl Makefile.PL ● make ● make test ● debug if errors ● make install Include the extra.last.conf.in section shown earlier to your httpd.conf,restart httpd, and visit http://localhost/hello
  14. 14. Test me, Test me Easily test with different httpd/mod_perl builds ● export APACHE_TEST_HTTPD = /path/to/test_httpd/bin/httpd ● export APACHE_TEST_APXS = /path/to/test_httpd/bin/apxs Test without having to 'make test' each time ● export APACHE_TEST_LIVE_DEV = /path/to/my/app/lib ./t/TEST -start-httpd ● ./t/TEST t/01hello.t ●
  15. 15. Review ● Created a basic test driven Apache::Dispatch based hello web service ● Wrote a test, a config file, and a method handler ● Reviewed Apache::Test basics
  16. 16. The Extras ● Pre-Dispatch method handler ● Post-Dispatch method handler ● Custom Error method handler ● Inheritance ● Autoloading
  17. 17. Pre-Dispatch Method Handler ● DispatchExtras Pre ● Used for setup common to dispatch_* methods ● Similar functionality in most frameworks ● Best suited for code re-use - DRY sub pre_dispatch { my ($class, $r) = @_; my %data = My::Model::Hello->data; # stash the data in the request for use later $r->pnotes( hello_common => %data ); }
  18. 18. Post-Dispatch Method Handler ● DispatchExtras Post ● Teardown for package dispatch_* methods ● As with pre_dispatch, similar to most frameworks, main function is DRY ● Still part of the response phase ● Runs after the dispatch_* handler, even if the response was not OK sub post_dispatch { my ($class, $r) = @_; $r->log->info(“Request to “ . $r->connection->remote_ip . “ was served”); }
  19. 19. Custom Error Method Handler ● DispatchExtras Error ● Handles error in dispatch_* methods ● Ignores errors in Pre/Post handlers sub error_dispatch { my ($class, $r, $payload, $rc) = @_; $r->log->error(“Oops!: $@”); if ($rc == Apache2::Const::NOT_FOUND) { $r->print( $self->process_tmpl('not_found.tmpl')); } return Apache2::Const::OK; }
  20. 20. Inheritance ● DispatchISA My::BaseHandler ● Useful for defining methods across different packages ● For example, define one error_dispatch method and share it among other classes ● Suggested that it be used with DispatchAUTOLOAD Off (default)
  21. 21. Autoloading ● DispatchAUTOLOAD On ● Autoloaded methos must be declared ● Read the camel book 3rd ed pp326-329 ● Read the examples in t/lib our $AUTOLOAD; sub dispatch_autoloaded_method; sub AUTOLOAD { my ($class, $r) = @_; $r->log->info(“Method $AUTOLOAD called”); # .... }
  22. 22. Filtering ● Use mod_perl2 filtering API for mp2 ● Apache::Dispatch has built-in filtering for mp1 httpd.conf => DispatchFilter On PerlResponseHandler Apache::Dispatch My::Filter package My::Filter; sub handler { my $r = shift; $r->send_http_header(); $r = $r->filter_register; my $fh = $r->filter_input; while (<$fh>) { # modify $_; print; } }
  23. 23. Lightweight ● http://chamas.com/bench ● 658.7 req/sec for Apache::Dispatch ● 856.0 req/sec for mod_perl handler ● Geoffrey Young's benchmarks ● <Location> and method handler – 14.34 req/sec ● A::D with DispatchISA On – 13.78 req/sec ● See Todo for the details ● One Perl module, not zillions
  24. 24. Dependencies ● None unless you want to do testing ● In which case you'll need ● Apache::Test ● LWP::UserAgent ● Compare this to other libraries/frameworks which use x number of modules to get started
  25. 25. Credits ● Geoffrey Young – Author, mod_perl and testing guru, helping me release the latest version soonish ● Thomas Klausner – Maintenance work and material for this talk ● The mod_perl community
  26. 26. References [1] - http://search.cpan.org/perldoc?Apache::Dispatch [2] - mod_perl Developers Cookbook http://www.modperlcookbook.org [3] - Josh Chamas' Hello World Benchmark http://chamas.com/bench/ [4] - Thomas Klausner's YAPC 2003 Presentation http://domm.zsi.at/talks/yapc2003 [5] - Apache::Test Part 2 Presentation http://modperlcookbook.org/~geoff/apache [6] - http://sourceforge.net/projects/apache-dispatch
  27. 27. Slides These slides are freely available at http://www.redhotpenguin.com/talks Try out the latest version of Apache::Dispatch at http://sourceforge.net/projects/apache-dispatch Coming soon to a CPAN mirror near you Thank you NPW 2006!

×