PSGI/Plack OSDC.TW
Upcoming SlideShare
Loading in...5
×
 

Like this? Share it with your network

Share

PSGI/Plack OSDC.TW

on

  • 7,854 views

 

Statistics

Views

Total Views
7,854
Views on SlideShare
7,384
Embed Views
470

Actions

Likes
7
Downloads
51
Comments
0

13 Embeds 470

http://coderwall.com 255
http://blog.plackperl.org 75
http://www.slideshare.net 50
http://endroid.blogspot.com 48
http://lickck.blogspot.tw 14
http://www.techgig.com 13
http://lickck.blogspot.com 8
http://sayperl.org 2
http://localhost:3000 1
http://www.lmodules.com 1
http://static.slidesharecdn.com 1
http://reblog.rot13.org 1
http://lickck.blogspot.jp 1
More...

Accessibility

Categories

Upload Details

Uploaded via as Apple Keynote

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />
  • <br />

PSGI/Plack OSDC.TW Presentation Transcript

  • 1. Plack Superglue for Perl Web Frameworks Tatsuhiko Miyagawa OSDC. 2010
  • 2. • • Six Apart • 177 CPAN modules (id:MIYAGAWA) • @miyagawa • http://bulknews.typepad.com/
  • 3. Web Frameworks (in Perl)
  • 4. Sharing, Stealing and Importing
  • 5. Web Frameworks in Perl
  • 6. Many ways to write Perl web applications
  • 7. Maypole Mason Mojo Sledge Catalyst Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious Tripletail Konstrukt Reaction Jifty Cyclone3 WebGUI OpenInteract Squatting Dancer CGI::Application Nanoa Ark Angelos Noe Schenker Tatsumaki Amon Apache2::WebApp Web::Simple Apache2::REST SweetPea Hydrant Titanium
  • 8. Some ways to run Perl web applications
  • 9. CGI, FastCGI & mod_perl
  • 10. CGI.pm
  • 11. Runs “fine” on: CGI, FastCGI, mod_perl (1 & 2) Standalone (with HTTP::Server::Simple)
  • 12. CGI.pm = LCD Perl core module
  • 13. 8803 lines of code First ver. in Nov.1995
  • 14. :-(
  • 15. CGI.PM MUST DIE!
  • 16. (just kidding)
  • 17. Catalyst The most popular perl web framework as of today
  • 18. Catalyst::Engine::* Server abstractions. Apache, FastCGI, Standalone and Prefork No CGI.pm
  • 19. CGI.pm Jifty, CGI::Application, Spoon mod_perl centric Mason, Sledge, PageKit, WebGUI Adapters Catalyst, Maypole, Squatting
  • 20. Can we share?
  • 21. ?
  • 22. HTTP::Engine Yappo, tokuhirom and nothingmuch etc.
  • 23. :-) Ported Catalyst engine code and made it sharable
  • 24. :-( Monolithic code base No separation of interface & impl.
  • 25. 2009
  • 26. Steal great idea from Python/Ruby
  • 27. Import stuff proven popular from Python/Ruby
  • 28. PROVEN POPULAR!
  • 29. Popular and successful in Python and Ruby
  • 30. WSGI (Python) Rack (Ruby)
  • 31. WSGI (PEP-333)
  • 32. WSGI • Django • mod_wsgi • Bottle • Paste • CherryPy • gunicorn • Tornado • uWSGI • Pylons • wsgiref • Flask • Google AppEngine
  • 33. Django Bottle Flask Tornado WSGI middleware WSGI wsgi handlers Apache lighttpd nginx mod_wsgi GAE
  • 34. Rack
  • 35. Rack • Rails • Unicorn • Merb • Thin • Sinatra • Mongrel • Camping • Rainbows! • Ramaze • Phusion Passenger • etc. • Heroku
  • 36. Rails Merb Sinatra Ramaze Rack middleware Rack Rack handlers Apache lighttpd Thin Unicorn Mongrel
  • 37. PSGI Perl Web Server Gateway Interface
  • 38. Interface
  • 39. # WSGI def hello(environ, start_response): start_response(“200 OK”, [ (‘Content-Type’, ‘text/plain’) ]) return [“Hello World”]
  • 40. # Rack class Hello def call(env) return [ 200, { “Content-Type” => ”text/plain” }, [“Hello World”] ] end end
  • 41. # PSGI my $app = sub { my $env = shift; return [ 200, [ ‘Content-Type’, ‘text/plain’ ], [ ‘Hello World’ ], ]; };
  • 42. PSGI application code reference $app = sub {...};
  • 43. my $app = sub { my $env = shift; return [ $status, $header, $body ]; };
  • 44. environment hash $env: CGI-like env variables + psgi.input, psgi.errors etc.
  • 45. my $app = sub { my $env = shift; return [ $status, $header, $body ]; };
  • 46. Response array ref with three elements status code, headers (array ref) and body (IO-like or array ref)
  • 47. my $app = sub { my $env = shift; return [ $status, $header, $body ]; };
  • 48. $body IO::Handle-like getline() and close()
  • 49. IO::Handle::Util Easily turns perl code ref into a IO::Handle
  • 50. Streaming interface
  • 51. my $app = sub { my $env = shift; return sub { my $respond = shift; # You could do some event loop # to delay response (e.g. Comet) $respond->([ $status, $header, $body ]); }; };
  • 52. my $app = sub { my $env = shift; return sub { my $respond = shift; my $w = $respond->([ $status, $header ]); $w->write($body); $w->write($body); ... $w->close; }; };
  • 53. Streaming Interface Originally designed for non-blocking servers Now available for most servers incl. CGI, Apache
  • 54. Catalyst CGI::App Jifty Tatsumaki Plack::Middleware PSGI Plack::Handler::* (CGI, FCGI, Apache) Apache lighttpd HTTP::Server::PSGI mod_psgi Perlbal
  • 55. PSGI adaptation
  • 56. Maypole Mason Mojo Sledge Catalyst Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious Tripletail Konstrukt Reaction Jifty Cyclone3 WebGUI OpenInteract Squatting Dancer CGI::Application Nanoa Ark Angelos Noe Schenker Tatsumaki Amon Apache2::WebApp Web::Simple Apache2::REST SweetPea Hydrant Titanium
  • 57. Maypole Mason Mojo Sledge Catalyst Spoon PageKit AxKit Egg Gantry Continuity Solstice Mojolicious Tripletail Konstrukt Reaction Jifty Cyclone3 WebGUI OpenInteract Squatting Dancer CGI::Application Nanoa Ark Angelos Noe Schenker Tatsumaki Amon Apache2::WebApp Web::Simple Apache2::REST SweetPea Hydrant Titanium
  • 58. Applications Movable Type, WebGUI
  • 59. # Catalyst use MyApp; MyApp->setup_engine(‘PSGI’); my $app = sub { MyApp->run(@_) }; # $app is a PSGI app!
  • 60. # Jifty use MyPonyApp; my $app = MyPonyApp->psgi_app; # $app is a PSGI app!
  • 61. # Dancer use Dancer; get ‘/’ => sub { “Hello World”; }; use Dancer::Config ‘setting’; setting apphandler => ‘PSGI’; my $app = sub { my $r = Dancer::Request->new(shift); Dancer->dance($r); }; # $app is a PSGI app!
  • 62. # Mojolicious::Lite use Mojolicious::Lite; get ‘/:name’ => sub { my $self = shift; $self->render_text(‘Hello!’); }; shagadelic; # returns PSGI app
  • 63. # Web::Simple use Web::Simple ‘MyApp’; package MyApp; dispatch { sub(GET) { [ 200, [...], [ ‘Hello’ ] ]; } }; my $app = MyApp->as_psgi; # $app is a PSGI app!
  • 64. Plack “PSGI toolkit”
  • 65. HTTP::Server::PSGI Reference PSGI web server bundled in Plack
  • 66. Plack::Handler Connects PSGI apps to Web servers CGI, FastCGI, Apache, SCGI
  • 67. Plackup Runs PSGI app instantly from CLI (inspired by rackup)
  • 68. > plackup app.psgi
  • 69. DEMO
  • 70. Middleware
  • 71. my $app = sub { my $env = shift; return [ $status, $header, $body ]; }; my $mw = sub { my $env = shift; # do something with $env my $res = $app->($env); # do something with $res; return $res; };
  • 72. Middleware Debug, Session, Logger, Runtime, Static, AccessLog, ConditionalGET, ErrorDocument, StackTrace, Auth::Basic, Auth::Digest, ReverseProxy, Refresh etc. (Imported from Rack and Paste)
  • 73. Plack::Middleware reusable and extensible Middleware framework Plack::Builder DSL in .psgi
  • 74. my $app = sub { return [ $status, $header, $body ]; }; use Plack::Builder; builder { enable “Static”, root => “/htdocs”, path => qr!^/static/!; enable “Deflater”; # gzip/deflate $app; }
  • 75. plackup compatible plackup -e ‘enable “Foo”;’ app.psgi
  • 76. DEMO
  • 77. Plack::App::URLMap Multiplex multiple apps Integrated with Builder DSL (Imported from Rack)
  • 78. use CatApp; use CGIApp; my $c1 = sub { CatApp->run }; my $c2 = sub { CGIApp->run_psgi }; use Plack::Builder; builder { mount “/cat” => $c1; mount “/cgi-app” => builder { enable “StackTrace”; $c2; }; }
  • 79. CGI::PSGI Easy migration from CGI.pm
  • 80. CGI::Emulate::PSGI CGI::Compile Easiest migration from CGI scripts (like Registry)
  • 81. Plack::Request like libapreq (Apache::Request) wrapper APIs for middleware developers
  • 82. Plack::Test Unified interface to write tests with Mock HTTP and Live HTTP
  • 83. use Plack::Test; use HTTP::Request::Common; my $app = sub { my $env = shift; return [ $status, $header, $body ]; }; test_psgi app => $app, client => sub { my $cb = shift; my $req = GET “http://localhost/foo”; my $res = $cb->($req); # test $res; };
  • 84. use Plack::Test; use HTTP::Request::Common; $Plack::Test::Impl = “Server”; my $app = sub { my $env = shift; return [ $status, $header, $body ]; }; test_psgi app => $app, client => sub { my $cb = shift; my $req = GET “http://localhost/foo”; my $res = $cb->($req); # test $res; };
  • 85. PSGI Web Servers
  • 86. Starman UNIX Preforking HTTP servers (like Unicorn.rb) HTTP/1.1 chunk + keep-alives / Very Fast
  • 87. Twiggy Non-blocking web server (like Thin.rb) based on AnyEvent framework
  • 88. Corona Coroutine for each connection based on Coro.pm
  • 89. HTTP::Server::Simple::PSGI Zero-deps other than HTTP::Server::Simple Best for embedding PSGI applications
  • 90. nginx embedded perl http://github.com/yappo/nginx-psgi-patchs
  • 91. mod_psgi http://github.com/spiritloose/mod_psgi
  • 92. evpsgi http://github.com/sekimura/evpsgi
  • 93. Perlbal plugin http://github.com/miyagawa/Perlbal-Plugin-PSGI
  • 94. uWSGI http://projects.unbit.it/uwsgi/
  • 95. Catalyst CGI::App Jifty Tatsumaki Plack::Middleware PSGI Plack::Handler::* (CGI, FCGI, Apache) Apache lighttpd HTTP::Server::PSGI mod_psgi Perlbal Starman Twiggy uWSGI Corona evpsgi
  • 96. Play with it
  • 97. > cpanm Plack > cpanm Task::Plack
  • 98. Cloud? (Heroku, GAE)
  • 99. Sunaba http://sunaba.plackperl.org/
  • 100. Runs on ’s Sandbox ( )
  • 101. You can even try: system(“rm -fr /”); while (1) { }
  • 102. • PSGI is an interface, Plack is the code. • We have many (pretty fast) PSGI servers. • We have adapters and tools for most web frameworks. • Use it!
  • 103. • Sharing is important. • Stealing is a good start. • Importing something successful is great.
  • 104. http://github.com/miyagawa/Plack http://plackperl.org/ http://blog.plackperl.org/ irc://irc.perl.org/#plack
  • 105. ?
  • 106. :-)