What's new in WebGUI 8.0 #1 - PSGI/Plack
Overview
On September 9, 2009, WebGUI 8 was announced. Since it was the first major API change since WebGUI 7, we started planning WebGUI 8 with high expectations. Over the course of the last 16 months:
We've adopted PSGI/Plack as our platform, enabling us to work in any HTTP environment.
We've made massive changes to the Asset system to make them easier to build.
We've reworked Auth to make it easier to add Twitter and Facebook authentication for your users.
We've rebuilt the upgrade system to be easier for developers and system administrators.
There is a new caching system enabling memcached and local memory caches.
The entire content management interface was rebuilt from scratch with the latest buzzword-worthy technologies.
Assets are now based on Moose, the new object-oriented system for Perl.
We've created WebGUI::FormBuilder, a way to make introspect-able forms.
We're migrating to InnoDB to take advantage of transactions and foreign key constraints.
We're making a brand-new WRE based on Nginx, and Server::Starter for more efficient resource usage and no-downtime restarts.
And these are just the major features. We've cleaned up and straightened out a lot of the crooked parts of programming in WebGUI, and we have plans to do even more. We've greatly improved the flexibility of WebGUI without compromising any more backward compatibility.
Ambition is the first step
Unfortunately, our ambitious goals have taken longer than we thought. We had promised a WebGUI 8.0 Beta in January, and I have to say that isn't possible. The way things look right now, WebGUI 8.0 will be ready this summer.
So, as atonement and apology, I offer this series of bi-weekly blog posts about all the new stuff in WebGUI 8.
PSGI / Plack
The most exciting change in WebGUI 8 is the move to PSGI using Plack. WebGUI is no longer just an Apache/mod_perl application, though it can certainly still run under Apache/mod_perl. Now, WebGUI can also run under Starman, a high-performance web server specifically for PSGI applications. WebGUI can run inside POE. WebGUI can once again run as CGI. We are no longer tied to one way of deploying WebGUI, and that greater flexibility will allow for better performance for your specific need.
#!/usr/bin/env perl
# webgui.cgi - Run WebGUI as a CGI application
use lib 'lib';
use Plack::Loader;
use Plack::Handler::CGI;
$ENV{WEBGUI_CONFIG} = "www.example.com.conf";
my $app = Plack::Util::load_psgi("share/site.psgi");
Plack::Handler::CGI->new->run($app);
Since WebGUI is just a PSGI application, it can also run alongside any other PSGI applications. WebGUI and Catalyst can work together on the same site.
For example, here's WebGUI and Pod::Browser running together. Pod::Browser takes /doc and serves the WebGUI POD, every other request goes to WebGUI.
# pod.psgi
use lib 'lib';
use Plack::Builder;
use Plack::Util;
BEGIN {
$ENV{POD_BROWSER_CONFIG} = "pod_browser.json";
}
use Pod::Browser;
use Catalyst::Engine::PSGI;
Pod::Browser->setup_engine('PSGI');
$ENV{WEBGUI_CONFIG} = "core.conf";
use WebGUI;
builder {
mount "/doc" => sub { Pod::Browser->run(@_); };
mount "/" => Plack::Util::load_psgi("share/site.psgi");
};
# pod_browser.json
{
"Controller::Root" : {
"self" : 1,
"inc" : 1,
"namespaces" : [ "WebGUI*" ]
}
}
For developers, Plack opens up new ways of building WebGUI sites. Instead of WebGUI::URL handlers, now we use Plack middleware to handle such tasks as:
Opening the WebGUI::Session
Handling /extras and /uploads
Showing the maintenance page, if necessary
Handling the wgaccess files for uploads permissions
Showing debugging information and performance indicators
By using more flexible tools, we can write more reusable code. You can write a Plack middleware for WebGUI that will work in your other Plack applications, and WebGUI can take advantage of the middleware out there on CPAN.
Plack middleware currently only replaces URL handlers, but someday we can replace WebGUI::Content handlers as well. WebGUI's pieces can be mixed and matched to create your own applications without using parts of WebGUI that you don't need.
By switching to PSGI/Plack, we've made WebGUI easier to deploy and easier to develop.
Next time, I'll talk about the improvements to the WebGUI Auth API.
Wow! You guys have been busy....good job.
While you /can/ run WebGUI under CGI now, wouldn't the fact that you're using Moose (instead of something more lightweight like Mouse) mean that startup times would be prohibitive for that option?
@James: Yes, however it's an irrelevant argument for two reasons:
1) WebGUI is enormous, way bigger than Moose, so you'd never want to run it under CGI anyway.
2) The changes we made using Moose couldn't have been done with Mouse. We needed the full Class::MOP infrastructure to achieve the things WebGUI is capable of doing.
I tested the CGI bit, and the page render time was 2.5 wallclock seconds / 0.9 user seconds on my laptop. Not horribly long, not nearly as bad as I was fearing, but not really useful for anything other than messing around.
This included: Loading the perl interpreter. Loading WebGUI, Moose, DBI, CHI, CGI, Plack, DateTime, and 2 dozen other WebGUI requirements. Loading the asset data from the database. Rendering a navigation (loading another 20 assets from the database). Loading all the debugging stuff.
In short, it does a lot in that 2.5 seconds.
If CGI is ever a goal of ours (I never plan on it, but stranger things have happened), we could use Any::Moose, but it's not a priority at the moment. Not sure if Mouse does everything we do with Moose, but that's coming up in a future blog post here, so I'll do that research then. This is also my chance to research everything that I didn't do myself to make sure it's awesome before it goes out the door.
preaction++