Um die Wiederverwendung von Java-Instanzen und ein besseres Handling (Pooling, Threading et cetera) zu gewährleisten, startet man nicht einfach eine beliebige JVM und konfiguriert PHP zum Zugriff darauf, sondern aktiviert einen speziellen Dienst, der die Java-Instanzen verwaltet. Über diesen Service lassen sich sowohl Port als auch maximal verfügbare Prozesse einstellen. Die Kommunikation mit dem Java-EE-Applikationsserver erfolgt via Remote Method Invocation (RMI). Nachteil dabei: Ein PHP-Programm kann nur auf Objekte zugreifen, die über ein Remote-Interface verfügen. In Sachen Performance profitiert dieser Weg also nicht von den in der Java-Spezifikation verankerten Optimierungen, den EJB Local Interfaces. Nach eigenen Angaben arbeitet Zend zurzeit an dieser Baustelle. Es sei noch erwähnt, dass die Firma zwar zusammen mit Sun den JSR 223 ins Leben rief, bisher aber keine offizielle PHP-Engine für Java vorgestellt hat.
Wer mit den bisher beschriebenen Möglichkeiten nicht zurechtkommt, dem bleibt eine letzte Option. Neben der offiziellen PHP-Distribution gibt es die nach der GPL lizenzierte und in Java geschriebene Ausführung Quercus. Dieses Wunderwerk stammt, wie oben schon erwähnt, von der Firma Caucho, Hersteller des Applikationsservers Resin, der auch Quercus enthält. Quercus' Scripting Engine ist dieselbe wie bei der PHP/Java Bridge. Vorteile zieht der Entwickler aus den zusätzlichen Funktionen, die das Paket bereitstellt. Dazu zählen ein Servlet Wrapper für PHP-Aufrufe sowie die komplette Verwaltung der PHP-Instanz innerhalb des Webcontainers. Quercus lässt sich als Webapplikation (.war) herunterladen. Nach dem Auspacken muss der Programmierer diese Datei in das Anwendungsverzeichnis eines beliebigen Webcontainers schieben und schon steht ihm ein halbwegs aktuelles PHP 5.2 unter Java zur Verfügung. Damit ist es denkbar einfach, vorhandenen Java-Anwendungen PHP-Funktionen anzubieten. Zwei Java-Bibliotheken muss er noch in das WEB-INF/lib kopieren und das PHP Servlet in der web.xml registrieren:
<servlet>
<servlet-name>PHPServlet</servlet-name>
<servlet-class>
com.caucho.quercus.servlet.QuercusServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>PHPServlet</servlet-name>
<url-pattern>*.php</url-pattern>
</servlet-mapping>
Leider ist auch hier nicht alles so einfach, wie es zunächst scheint. Zwar stehen schon eine Menge PHP-Module für Quercus zur Verfügung (darunter APC, iconv, GD, gettext, JSON, MySQL, Oracle, PDF und Postgres) aber die komplette Palette deckt das Angebot noch nicht ab. Dennoch sind viele bekannte PHP-Anwendungen unter Quercus lauffähig, etwa DokuWiki, Drupal, Gallery2, Joomla, Mambo, Mantis, MediaWiki, Phorum, phpBB, phpMyAdmin, PHP-Nuke, Wordpress und XOOPS. Leider enttäuscht die kostenlose Version des Werkzeugs mit einem großem Nachteil: Datenbankzugriffe lassen sich nur per Java Naming and Directory Interface (JNDI) ausführen. Der normale PHP-Zugriff funktioniert nur in der lizenzpflichtigen Professional-Version des Application Server.
// PHP-DB-Zugriff
//mysql_connect($host, $username, $password, $dbname);
// JNDI-Zugriff mysql_connect("java:comp/env/jdbc/myDatabaseName");
Ebenfalls ein Schmankerl, in dessen Genuss nur die Professional-Lizenznehmer kommen: Quercus kann PHP-Quellen nicht nur zur Laufzeit interpretieren, sondern auf Wunsch auch vorkompilieren. In produktiven Umgebungen ergibt sich hier sicher ein Performancegewinn.
Es ist nicht möglich, eine pauschale Empfehlung für den richtigen Weg zu geben, zu unterschiedlich sind die Anforderungen. Wer in PHP-Webseiten gelegentlich einige Java-Funktionen verwenden möchte, muss eine andere Architektur aufbauen, als jemand, der eine Java-Webanwendung um PHP-Teile erweitern will. Das am häufigsten gewünschte Szenario ist vermutlich das anfangs skizzierte Java-Backend mit Geschäftsdaten im Zusammenspiel mit einer agilen und modernen PHP-Weboberfläche. Bei Unternehmen, die so etwas wollen, kann ein Produkt mit professionellem Support punkten – und hier bleibt nur Zends Java Integration Bridge. Wer nicht auf kommerzielle Unterstützung angewiesen ist, kann sich am PHP/Java-Bridge-Projekt auf Sourceforge versuchen. Am einfachsten gestaltet sich die Kommunikation über Webservices (XMLRPC/SOAP). Dafür braucht man in der Regel nicht einmal eine zusätzliche Architekturkomponente, bekommt allerdings auch keine integrierte Lösung.
Markus Eisele
arbeitet im Bereich Software-Technologie im Center of Competence IT-Architecture der MSG Systems AG.
Auf der nächsten Seite: Onlinequellen
Themenforum: Java