XLVII. Java
Es gibt zwei Wege, um die Welten von Java und PHP zu verbinden. Einerseits
besteht die Möglichkeit PHP in eine Java Servlet Umgebung zu integrieren,
andererseits kann man mit der Java Extension aus PHP heraus auf Java Klassen
zugreifen. Die erste der beiden genannten Möglichkeit ist wesentlich
stabiler und performanter als die zweitgenannte Lösung.
Die Java Erweiterung für PHP nutzt das Object Overloading von PHP 4 um auf
Java Klassen zuzugreifen. Die Java Virtual Machine (JVM) wird hierbei über
das Java Native Interface (JNI) erzeugt. Eine detaillierte
Installationsbeschreibung entnehmen Sie bitte der Datei
php4/ext/java/README.
Beispiel 1. Zugriff auf Java Klassen aus PHP heraus <?php
// In PHP Instanz der Java Klasse java.lang.System erzeugen
$system = new Java('java.lang.System');
// Zugriff auf die Objekteigenschaften
print 'Java version='.$system->getProperty('java.version').' <br>';
print 'Java vendor=' .$system->getProperty('java.vendor').' <br>';
print 'OS='.$system->getProperty('os.name').' '.
$system->getProperty('os.version').' on '.
$system->getProperty('os.arch').' <br>';
// java.util.Date Beispiel
$formatter = new Java('java.text.SimpleDateFormat',
"EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
print $formatter->format(new Java('java.util.Date'));
?> |
|
Beispiel 2. Zugriff auf Java AWT aus PHP heraus <?php
// Dieses Beispiel kann nur als CGI ausgeführt werden.
$frame = new Java('java.awt.Frame', 'PHP');
$button = new Java('java.awt.Button', 'Hallo Java Welt!');
$frame->add('North', $button);
$frame->validate();
$frame->pack();
$frame->visible = True;
$thread = new Java('java.lang.Thread');
$thread->sleep(10000);
$frame->dispose();
?> |
|
Notes:
new Java() erzeugt eine Instanz der angegebenen Java
Klasse, falls ein geeigneter Konstruktur gefunden wird. Für den Zugriff
auf Klassen mit statischen Methoden benötigt man keinen Parameter.
Beim Zugriff auf Mitglieder (Members) einer Instanz wird zunächst nach
Bean Eigenschaften gesucht, danach erst nach öffentlichen (public)
Eigenschaften. Mit anderen Worten: Es wird zuerst versucht werden, zum
Beispiel print $date.time als
$date.getTime() zu interpretieren, danach erst wird
$date.time versucht werden.
Der Zugriff auf statische und Instanzeigenschaften erfolgt mit der selben
Syntax.
Das Auslösen einer Java Exception resultiert in einer PHP Warnung und
einem NULL Ergebnis. Folgende Funktionen ermöglichen den Zugriff auf die
eigentlichen Exceptions:
Traditionell können Arrays und Hashes in PHP weitestgehend als
gleichwertig angesehen werden. Beim Austausch dieser Datentypen zwischen
PHP und Java ist zu beachten, dass Hashes in PHP nur mit Integer- und
Stringwerten indiziert werden können und Arrays von primitiven Datentypen
in Java nicht dünn besetzt sein dürfen. Ferner ist zu beachten, dass
diese Datenstrukturen by-Value übergeben werden, was ungünstig in Bezug
auf Speicher- und Zeitbedarf sein kann.
Das PHP 4 Servlet SAPI Modul baut auf dem von der Java Extension zur
Verfügung gestellten Mechanismus auf, allerdings wird der PHP Prozessor
hierbei von einer Servlet Engine, wie zum Beispiel Apache Jakarta / Tomcat,
ausgeführt. Dies führt zu einer wesentlich höheren Stabilität und besserer
Performance als der umgekehrte Weg, wie in die Java Extension an sich
anbietet. Dies kommt daher, dass die Servlet Engine sich um das Pooling und
die Wiederverwendung von Java Virtual Machines (JVMs) kümmert. Eine
detaillierte Anleitung zur Integration von PHP in eine Servlet Engine
entnehmen Sie bitte der Datei php4/sapi/README.
Bemerkungen:
Das Servlet SAPI Modul sollte zwar auf jeder Java Servlet Engine
funktionieren, wurde aber bislang nur in Verbindung mit Apache
Jakarta/Tomcat getestet. Meldungen von Problem - aber auch von
Erfolgserlebnissen - bei der Verendung mit anderen Servlet Engines werden
dankbar aufgenommen.
PHP hat die Angewohnheit das aktuelle Arbeitsverzeichnis (CWD) zu ändern.
sapi/servlet wird versuchen, den alten Zustand wieder herzustellen.
Während PHP läuft kann es sein, dass die Servlet Engine kann Klassen aus
dem CLASSPATH finden kann, die über relative Pfade angesprochen werden.