Zum Inhalt springen →

Java oder PHP? Eine Frage weniger dank JPHP

Muss man sich zwischen Java und PHP entscheiden wird die Entscheidung im Enterprise Umfeld oft zu Gunsten von Java getroffen. Dies hat verschiedene Gründe, auf die ich hier im Detail garnicht eingehen möchte.
Nun gibt es aber in einigen Fällen die Situation, dass beide Programmiersprachen ihre Stärke ausspielen könnten und man sich aber für eine entscheiden muss.

JPHP – PHP Code in der Java VM

Für diesen Fall gibt es nun JPHP. Hierbei handelt es sich um einen PHP Compiler, der ähnlich wie JRuby oder Jython aus PHP Code einen lauffähigen Bytecode erstellt, der in einer JVM lauffähig ist. Dabei wird JDK 1.6 und höher von JPHP unterstützt und der Java-Bytecode ist sowohl in der Oracle VM als auch in der OpenJDK lauffähig.

Folgende Features werden momentan von JPHP unterstützt

  • JIT (2x – 10x schneller als PHP 5.4)
  • Bytecode Optimizer (constant expressions, inline functions, etc.)
  • Verwendung von Java Bibliotheken und Klassen im PHP Code
  • Unicode String (UTF-16)
  • Threads
  • Sockets
  • GUI (Swing)
  • etc.

Eine vollständige Auflistung aller Features kann man unter https://github.com/dim-s/jphpfinden.

PHP Unterstützung

Das Projekt wurde im Oktober 2013 ins Leben gerufen und unterstützt daher noch nicht alle aktuellen PHP Features. Doch es gibt schon jetzt eine vollständige PHP 5.2 Unterstützung und darüber hinaus noch eine ganze Reihe weiterer PHP Langunage-Features wie z.B. Namepsaces, Closures, Try-Finaly etc.

Damit ist JPHP schon ganz gut gerüstet, um eine Brücke zwischen Java und PHP zu bauen, die für einige Entwickler eine echte Erleichterung darstellen kann. Mein erster Test läuft zwar aktuell noch auf eine Exception, aber vermutlich habe ich hier noch irgendetwas falsch gemacht.

Starting delay = 151 millis
Exception in thread "main" java.lang.IllegalStateException
at org.objectweb.asm.tree.ClassNode.<init>(Unknown Source)
at org.develnext.jphp.core.compiler.jvm.node.ClassNodeImpl.<init>(ClassNodeImpl.java:11)
at org.develnext.jphp.core.compiler.jvm.stetament.ClassStmtCompiler.<init>(ClassStmtCompiler.java:56)
at org.develnext.jphp.core.compiler.jvm.JvmCompiler.compile(JvmCompiler.java:211)
at php.runtime.launcher.Launcher.loadFromFile(Launcher.java:117)
at php.runtime.launcher.Launcher.loadFrom(Launcher.java:127)
at php.runtime.launcher.Launcher.run(Launcher.java:199)
at php.runtime.launcher.Launcher.run(Launcher.java:178)
at php.runtime.launcher.Launcher.main(Launcher.java:232)

Möglicherweise verwende ich auch noch eine falsche Version des ASM. ASM (http://forge.ow2.org/projects/asm/)ist ein Java-Bytecode-Manipulation Framework, mit dem man den JAVA Bytecode direkt manipulieren kann. Aktuell habe ich Version 5.0.1 im Einsatz, werde aber noch mal die Maven Konfiguration checken und evtl. noch mal eine andere Version testen.

Da ist auch schon das erste Problem erkannt. In der Maven Konfiguration ist Version 4.1 eingetragen. Also schnell die Version ausgetauscht und noch einmal testen.

JPHP GitHub Repository

Ich habe das Projekt mal geforkt und mein kleines “Hello Word Beispiel ergänzt. Dabei habe ich ganz bewusst einen ganz einfachen Einstieg ermöglicht. Im Verzeichnis test1findet man alles, was man für einen ersten Test unter Linux benötigt.

Hier geht es zum JPHP GitHub Repository.

Mit Hilfe der Dateien im Ordner test1, kann man einfach mal den Launcher testen, ohne gleich mit Maven und Co. anfangen zu müssen.

JPHP Beispiel

Ich habe einfach mal ein kleines Hello World PHP File erstellt und mit dem Launcher in der Java VM laufen lassen.

openSUSE-131-64-minimal:/projects/jphp/git/jphp/test1 # !java
java -classpath jphp.jar php.runtime.launcher.Launcher
Starting delay = 168 millis
Hello World
openSUSE-131-64-minimal:/projects/jphp/git/jphp/test1 #

Tatsächlich hat das auf Anhieb geklappt. Nun ist ein einfaches kleines Hello World erst mal noch nicht viel wert, zeigt aber das das Prinzip funktioniert. Aber auch eine kleine Ergänzung des PHP Files zeigt, dass Funktionen wie file oder var_dump ohne Probleme funktionieren.

openSUSE-131-64-minimal:/projects/jphp/git/jphp/test1 # java -classpath jphp.jar php.runtime.launcher.Launcher
Starting delay = 195 millis
Hello World
array(1) {
  [0]=>
  string(17) "Dies ist ein Test"
}
openSUSE-131-64-minimal:/projects/jphp/git/jphp/test1 #

JPHP Grenzen

Allerdings hat JPHP auch seine Grenzen. So habe ich mal eine MySQL Verbindung im Test ergänzt und schon ist JPHP (momentan noch) am Ende.

openSUSE-131-64-minimal:/projects/jphp/git/jphp/test1 # !java
java -classpath jphp.jar php.runtime.launcher.Launcher
Starting delay = 206 millis
Hello World
array(1) {
  [0]=>
  string(17) "Dies ist ein Test"
}

[E_ERROR] Call to undefined function mysql_connect()
    at line 9, position 9

    in 'test.php'
   at php.runtime.env.Environment.error(Environment.java:719)
   at php.runtime.env.Environment.error(Environment.java:711)
   at php.runtime.env.Environment.error(Environment.java:730)
   at php.runtime.invoke.InvokeHelper.call(InvokeHelper.java:245)
   at -> include (test.php:4)
   at sun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethodAccessorImpl.java)
   at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
   at java.lang.reflect.Method.invoke(Method.java:606)
   at php.runtime.reflection.ModuleEntity.include(ModuleEntity.java:77)
   at php.runtime.launcher.Launcher.run(Launcher.java:205)
   at php.runtime.launcher.Launcher.run(Launcher.java:178)
   at php.runtime.launcher.Launcher.main(Launcher.java:232)

Naja, also kann ich mein WordPress also doch noch nicht komplett im Tomcat laufen lassen. Trotzdem kann man mit JPHP schon eine Reihe von PHP Sourcen in der Java VM laufen lassen. Wer genauer wissen möchte, welche PHP Funktionen genau unterstützt werden, kann unter jphp-cores im Java Package “php.runtime” prüfen, ob die eigenen Anforderungen erfüllt werden.

JPHP Lizenz

Ein viel zu selten beachtetes Thema ist das Thema Lizenz. Bei JPHP ist das aber kein großes Problem, denn jphp wird unter der Apache Lizenz (Version 2) weitergegeben und diese Lizenz ist schon sehr komfortabel. Die Lizenz ist auch zu GPL3 kompatibel und jphp basierte Software darf auch unter dieser Lizenz frei in jedem Umfeld verwendet, modifiziert und verteilt werden. Es ist sogar möglich, Eigene Software, die unter Apache-Lizenz stehende Software verwendet, unter einer anderen Lizenz zu veröffentlichen.

Details zu der Apache Lizenz kann man z.B. bei Wikipedia finden (http://de.wikipedia.org/wiki/Apache-Lizenz)

Veröffentlicht in Java PHP