Quercus est un logiciel open source, développé par la société Caucho, permettant de faire fonctionner une application PHP dans une machine virtuelle Java.
Présentation de Quercus
Société Caucho
Quercus a été développé par la société Caucho, connue des habitués de Java pour leur serveur d’applications Resin et auteur des protocoles de communication Burlap et Hessian, basés sur HTTP, avec du contenu XML ou binaire. Tous ces produits sont distribués sous licence open source, avec des versions dites professionnelles, sous licence commerciale.
Resin est un serveur d’applications Java, destiné au déploiement d’applications Web. De ce fait, il est en concurrence directe avec Apache Tomcat, mais aussi avec tous les serveurs d’applications JavaEE, comme IBM Websphere, Oracle Weblogic ou RedHat JBoss. Resin est le premier serveur d’applications Java capable de supporter le déploiement d’applications PHP, en mode in-process, grâce à l’intégration de Caucho. Glassfish, le serveur d’applications JavaEE open source de Sun, lui emboite le pas puisqu’il embarque aussi Quercus pour la version 3.
Mode de fonctionnement
Dans toutes les solutions concurrentes, les pages PHP et les classes Java sont exécutées dans des processus séparés et communiquent via les couches du réseau. A l’opposé, avec Quercus, le PHP est exécuté au sein du même processus que Java, ce qui économise toutes les communications inter-processus.
Dans la version open source, Quercus interprète le code PHP, alors que la version professionnelle est capable de la compiler en byte-code Java, ce qui améliore encore les performances. Quercus est donc une implémentation du moteur PHP, indépendante de celle fournie par php.net.
Pour valider le fonctionnement, Caucho a testé un certain nombre d’applications PHP classiques, comme Typo3, MediaWiki, Drupal ou WordPress. Les résultats semblent probants, puisque sur certains tests, Quercus est quatre fois plus performant que le moteur PHP traditionnel.
Avantages
Outre l’interopérabilité des langages, les avantages de Quercus sont à chercher du coté des performances, ainsi que de certains services fournis par Java, comme la gestion des connexions aux bases de données par pools, grâce aux datasources.
Utilisation de Quercus
Quercus est intégré dans Resin. Il suffit donc d’installer ce dernier pour pouvoir l’utiliser.
Pouvoir déployer des pages PHP dans un serveur d’applications Java ne présente, en tant que tel, que peu d’intérêt. Cet exercice devient vraiment productif si le code PHP et le code Java peuvent interagir facilement, et si l’application PHP peut exploiter les ressources du serveur d’applications.
Connexion aux bases de données
En java, les connexions aux bases de données relationnelles se font via les drivers Java et les datasources. Toute connexion se fait en utilisant une API standard qui s’appelle JDBC, et le code Java est strictement identique pour les différents types de bases de données (Oracle, MySql, Microsoft SqlServer…). Pour les applications Web, les connexions sont gérées au sein de pools et partagées entre les différents utilisateurs, via des composants appelés DataSource. Ces composants sont paramétrés dans le serveur d’applications et mis à disposition des applications déployées via le registre JNDI.
mysql_connect
Pour accéder à une base de données MySql, le développeur PHP utilise la foncion mysql_connect, en lui passant les paramètres de connexion (host, username, password et dbname). La même fonction peut être utilisée pour établir une connexion via une datasource ; dans ce cas, seul le nom de la datasource est passée en paramètre. Pour que cela fonctionne, il faut que la datasource ait été créée dans le serveur d’applications.
// Connection traditionnelle, en PHP
mysql_connect($host, $username, $password, $dbname);
// Connection via une datasource
mysql_connect("java:comp/env/jdbc/sewa-ds");
Par configuration, dans le fichier WEB-INF/resin-web.xml, il est possible d’ignorer les paramètres et d’imposer une base de données. Ceci peut être fort utile dans le cadre du portage d’une application PHP traditionnelle vers Quercus.
<web-app xmlns="link:http://caucho.com/ns/resin[http://caucho.com/ns/resin]">
<database jndi-name="jdbc/mysql">
<driver type="org.gjt.mm.mysql.Driver">
<url>jdbc:mysql://localhost:3306/test</url>
<user></user>
<password></password>
</driver>
</database>
</web-app>
Classe PDO
La classe PDO (Portable Data Object) permet de fournir des connexions à des bases de données, via des datasources, sans se préoccuper de leur type. Pour utiliser une connexion gérée par une datasource, il faut instancier un objet de type PDO en lui passant le nom complet de la datasource.
$connection = new PDO("java:comp/env/jdbc/my-database");
Appel de classe Java
Classes standard
Il est possible d’instancier une classe Java standard, il faut utiliser la classe Java : $a = new Java("java.util.Date", 123);. Il est possible de gérer des imports de nom, qui allègent la notation au moment de l’instanciation : import java.util.Date;. Dans ce cas, l’instanciation est encore plus simple et ressemble à l’instanciation d’une classe PHP : $a = new Date(123);
Les classes utilisables sont accessible via le système de classloaders de Resin. Elles doivent être dans une des localisations suivantes :
-
WEB-INF/classes/ de l’application
-
WEB-INF/lib/*.jar de l’application
-
lib/*.jar de Resin
Il est possible de mélanger des classes PHP et des classes Java dans le répertoire WEB-INF/classes/.
Méthodes
L’appel de méthode peut se faire de façon classique. L’accès aux propriétés peut être fait de façon simplifiée, sans utiliser le get ou le set explicitement.
Les méthodes static sont accessible via la classe java_class : $class = java_class("java.lang.System"); puis $in = $class→in; ou directement sur la classe, si un import a été fait au préalable : $calendar = Calendar::getInstance();.
Lorsque de méthodes sont surchargées, le nombre d’arguments est prédominant. Par contre, si plusieurs méthodes ne sont différenciées que par le type des arguments, l’aspect non typé peut poser problème.
Fonctions
Les méthodes des classes qui héritent de AbstractQuercusModule sont exposées sous forme de fonctions PHP.