Cela fait maintenant quelques années que Perl, en tant que langage de développement web, se fait discret. Beaucoup de développeurs l’utilisent toujours, mais la (relativement récente) vague Python/Ruby s’est ajoutée à PHP pour occuper l’essentiel du Web. En tant que sysadmin, j’ai une tendance naturelle au conservatisme : si ça marche, ne touche à rien. Bon, évidemment, ça ne s’applique pas partout, mais quand il s’agit de programmation, j’aime bien me dire que Perl fera le boulot au moins aussi bien, et peut-être mieux, que d’autres langages.
J’étais donc curieux du petit dernier de la communauté Perl : le framework MVC Mojolicious. Petit frère du très reconnu Catalyst, Mojolicious est un projet récent qui essaie de corriger certains mécontentements que les moines de Perl ont pu ressentir en utilisant Catalyst. Dans la mesure où les robes en bure, hormis le fait que ça gratte, ce n’est pas ma spécialité (et n’étant pas développeur de nature), cet article n’est pas un rapport d’expertise sur Perl et les frameworks MVC, mais plutôt une introduction au développement web avec Perl et Mojolicious 1.1.
1. L'indispensable Hello World
Très simple à afficher une fois que Mojolicious est installé. D'ailleurs cette installation est, elle aussi, très simple (c'est un des objectifs du framework). En passant par cpanminus (un module Perl qui s'occupe des étapes de téléchargement, configuration, installation automatique), la commande pour installer Mojolicious est aussi simple que :
|
|
$ curl -L cpanmin.us | perl - Mojolicious --local-lib=/var/www/testmojo/mojolicious/ |
curl se connecte à cpanmin.us (ouvrez la page dans votre navigateur, ça pointe vers un module Perl hébergé sur github), récupère App::cpanminus et le fait exécuter par Perl pour installer Mojolicious. L'option –local-lib permet d'installer Mojolicious dans un répertoire choisi par l'utilisateur. Vous pouvez également lancer cette commande sans spécifier de local lib, auquel cas il vous faudra être root et Mojolicious s'installera dans les répertoires du système.
Note
Perl recherche les modules disponibles dans une liste de répertoires contenus dans la variable @INC. Essayez la commande perl -e 'foreach(@INC){print “$_\n”;}' pour afficher cette liste sur votre machine.
L'installation locale nous laisse avec 3 répertoires : bin, lib, et man. Le premier contient trois programmes (config_data, hypnotoad et mojo) dont nous aurons besoin un peu plus tard. Le second contient tous les modules de Mojolicious et le troisième contient toute la documentation.
|
|
julien@arael:/var/www/testmojo$ tree -L 2 mojolicious/ mojolicious/ |---bin | |---config_data | |---hypnotoad | `---mojo |---lib | `---perl5 |---man |---man1 `---man3 |
Pour rester dans les bonnes pratiques, on va déplacer les modules dans un répertoire lib à la racine de la webapp.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
|
julien@arael:/var/www/testmojo$ mv mojolicious/lib/perl5/ lib $ tree lib/ -L 1 lib/ |--- CPAN |--- ExtUtils |--- inc |--- Module |--- Mojo |--- Mojolicious |--- Mojolicious.pm |--- Mojo.pm |--- ojo.pm |--- Perl |--- README.pod |--- Test `--- x86_64-linux-gnu-thread-multi |
Il ne restera plus qu'à inclure ce répertoire " lib " dans le code de la webapp.
La page de manuel de Mojolicious::Lite présente un exemple de " Hello World! " avec lequel nous allons démarrer.
|
|
$ man ./mojolicious/man/man3/Mojolicious::Lite.3pm NAME Mojolicious::Lite - Micro Web Framework [...] Hello World! A minimal Hello World application looks like this, strict and warnings are automatically enabled and a few functions imported when you use Mojolicious::Lite, turning your script into a full featured web application. #!/usr/bin/env perl use Mojolicious::Lite; get '/' => sub { shift->render(text => 'Hello World!') }; app->start; [...] |
Le code ci-dessus utilise le module Mojolicious::Lite, une version simplifiée du framework, et démarre une application qui renvoie le texte 'Hello World!' dès qu'un client effectue un GET sur la page '/'.
1.1. Exécuter le code
Par habitude, mon premier réflexe en découvrant Mojolicious a été de monter un serveur Nginx avec FastCGI via spawn-fcgi et fcgiwrap, ma configuration habituelle pour exécuter du Perl/CGI. Mais ce n'est pas idéal. Le problème de cette configuration, c'est sa lenteur. Dans ma configuration de test, fcgiwrap ne parvenait pas à répondre à plus de 2,5 requêtes par seconde (sur un petit processeur, je vous l'accorde).
Or Mojolicious embarque toute une couche de communication, incluant les protocoles de transport que sont HTTP, CGI/FastCGI/PSGI et également un support des WebSockets. De fait, un programme utilisant Mojolicious peut directement lancer son propre serveur web (on verra plus tard comment contrôler cela avec Hypnotoad).
Note
Si vous avez installé Mojolicious en local, pensez à inclure les bibliothèques dans le script 'hello.pl' en ajoutant le code suivant en début de fichier :
Lancez le serveur avec la commande suivante :
|
|
$ perl hello.pl daemon --reload Sat Feb 26 15:14:45 2011 info Mojo::Server::Daemon:320 [7792]: Server listening (http://*:3000) Server available at http://*:3000. |
Et dirigez-vous vers http://localhost:3000/ pour admirer votre Hello World.
L'option –reload indique à Mojolicious de recharger automatiquement le code lorsqu'il est modifié. Ainsi, si vous changez " Hello World! " par " Bonjour Jean-Kevin… " et sauvegardez, le changement sera pris en compte sans relance du serveur.
Vous noterez également que la console dans laquelle le serveur est lancé affiche les logs de chaque requête. Pratique pour déboguer.