# Einfacher PHP-Interpreter



## destroflyer (1. Aug 2010)

Hi, 
kennt jemand einen simplen PHP-Interpreter? Er sollte einfache Ausdrücke wie 'echo "Hello World";' interpretieren und ausgeben können. Ich habe zwar etwas namens 'Quercus' bzw. 'Resin' gefunden, das erschein mir aber zu komplex, da ich es beim besten Willen nicht einbinden könne.

Gruß, destro


----------



## Sekundentakt (1. Aug 2010)

Hast Du einen konkreten Anwendungsfall?

Es gibt seitens von PHP eine Bibliothek, mit deren Hilfe sich Java-Anwendungen über PHP-Scripte ansteuern lassen und deren Ergebnisse in PHP weiterverwendet werden können.

PHP-Java-Bridge


----------



## destroflyer (2. Aug 2010)

Genau das will ich ja nicht... -.-
Ich will, dass in Java z.B. in einem Textfeld ein PHP-Code interpretiert und ausgegeben wird. Wenn im Textfeld z.B.
*for($i=0;$i<3;$i++){ echo "hello world"; }*
steht, soll nach dem interpretieren dreimal "hello world" im Textfeld stehen.

Im Grunde genommen brauche ich eine Funktion des Schemas:
*public String interpretiere(String phpCode) { ... }*

Gruß, destro


----------



## Sekundentakt (2. Aug 2010)

Hi,

so ein Interpreter ist kein Leichtgewicht.
Ich bin mir sicher, dass es sowas als Eclipse-Plugin gibt. 
Das Einzige was ich mir vorstellen könnte, wäre, dass Du den Code als Text an ein PHP Script sendest, den Code dort über eval() verarbeitest und den Rückgabewert über XML, JSON oder Ähnliches bei Dir im Programm ausgibst.
Eval() ist allerdings nicht gerade sehr bekannt dafür, dass es schnell ist. Für lastige Anwendungen also eher ungeeignet. 

Das wäre m.E. eine Lösung, die sich so auch schnell umsetzen ließe. 

Viel Erfolg!


----------



## Sekundentakt (2. Aug 2010)

Eventuell interessant für Dich: Running PHP within Web Server


----------



## mvitz (2. Aug 2010)

Evtl. gibts auch die Möglichkeit nen PHP Interpreter über javax.script anzusprechen.


----------



## ice-breaker (2. Aug 2010)

mvitz hat gesagt.:


> Evtl. gibts auch die Möglichkeit nen PHP Interpreter über javax.script anzusprechen.



was mit Quercus möglich ist.


----------



## destroflyer (2. Aug 2010)

Das Problem ist nur, dass das ganze auch offline möglich sein soll... Es muss ja nicht zwangsläufig jede Funktion enthalten sein, Schleifen und Variablen jedoch schon.



> Das Einzige was ich mir vorstellen könnte, wäre, dass Du den Code als Text an ein PHP Script sendest, den Code dort über eval() verarbeitest und den Rückgabewert über XML, JSON oder Ähnliches bei Dir im Programm ausgibst.


Über so etwas hatte ich auch schon nachgedacht, aber den Code gibt der User ein, also ziemlich unsicher...

Gruß, destro

*P.S.:* Kennt sich jemand mit Quercus aus und kann mir ein simples Beispiel zeigen? (_Zu dem 3xHelloWorld-Code oben_)


----------



## Gastredner (3. Aug 2010)

Der Aufruf des PHP-Interpreters sollte (wenn Quercus im Classpath ist) genauso wie der Aufruf des JavaScript-Interpreters funktionieren, wie es hier gezeigt wird.


----------



## r.w. (4. Aug 2010)

Je nach Anwendungsfall besteht auch die Möglichkeit, PHP lokal zu installieren (läuft auch ohne Webserver).
Den zu evaluierenden Quellcode könnte man in eine Temp-Datei schreiben und diese dem PHP-Interpreter per 
Kommandozeilenaufruf übergeben. Den Output in der Kommandozeile könnte man dann wieder in der Java-Applikation 
abfangen und anzeigen.

Nur so eine Idee. 

VG ROlf


----------



## destroflyer (9. Aug 2010)

Sorry, dass ich nochmal nachfrage, aber wie genau kann ich denn Quercus nutzen. Ich habe es mit dem Code, auf den *Gastredner* verwies, versucht, aber der schmeißt eine Fehlermeldung nach der anderen.
Kann jemand bitte ein einfaches Beispiel geben, wie ich einen simplen PHP-Befehl ausführen kann? (_Sollte offline und ohne PHP-Installation möglich sein_)

Gruß, destro


----------



## destroflyer (16. Sep 2010)

Tut mir leid, dass ich den Thread nochmal ausgrabe...  Aber ich muss wissen, wie ich Quercus nutzen kann.


			
				von mir hat gesagt.:
			
		

> Ich habe es mit dem Code, auf den Gastredner verwies, versucht, aber der schmeißt eine Fehlermeldung nach der anderen.
> Kann jemand bitte ein einfaches Beispiel geben, wie ich einen simplen PHP-Befehl ausführen kann? (Sollte offline und ohne PHP-Installation möglich sein)


----------



## tfa (16. Sep 2010)

Ein Beispiel, wie man Scriptsprachen generell in Java einbinden kann, findest du hier:
http://www.java-forum.org/blogs/tfa/11-snippet-scripting-jruby.html
Hier wird allerdings JRuby verwendet. 

Eine Liste der untersützen Scriptsprachen (mit deren Engines) gibt es auf dieser Seite:
https://scripting.dev.java.net/

Ganz unten findest du auch einen Link zu Quercus.


----------



## destroflyer (16. Sep 2010)

Danke für die schnelle Antwort.  Ich hab' mir den unteren Link mal angeschaut... Nach einigem Suchen habe ich das hier gefunden:


> Part I: Installing Resin
> Downloading and unzipping Resin
> 
> 1. Navigate to caucho.com  download
> ...



Ich komme nur bis zu dem Punkt *2. Double-click httpd.exe. At this point the resin web server should start.*. Ich habe Resin 4.0.10 heruntergeladen und entpackt. Allerdings finde ich keine httpd.exe-Datei...

Gruß, destro


----------



## tfa (16. Sep 2010)

Ich hoffe doch, man muss nicht dieses ganze Resin-Geraffel installieren, nur weil man einen PHP-Interpreter haben will.
Hier hab ich noch einen Artikel zu dem Thema gefunden. Vielleicht hilft dir das ja:



> Die Verwendung von PHP-Scripten innerhalb von Java ist damit ein Vierzeiler geworden:
> 
> 1. ScriptEngineManager m = new ScriptEngineManager();
> 2. ScriptEngine phpEngine = m.getEngineByExtension("php");
> ...


Integration von PHP mit der Java Enterprise Edition


----------



## destroflyer (16. Sep 2010)

Aber genau dafür muss man sich noch Sachen wie Apache Tomcat etc. installieren.



			
				JavaBridge Website (Sourgeforce) hat gesagt.:
			
		

> Installation
> 
> 1. Test your PHP installation with:
> 
> ...



Denn alleine mit dem Vierzeiler wird eine Fehlermeldung geschmissen, da *phpEngine* null ist (_da das ganze andere zeug noch nicht installiert ist_)

Gruß, destro


----------



## Gastredner (16. Sep 2010)

Bei Quercus wohl nicht, da wird wohl eine komplette Java-Implementierung des PHP-Interpreters mitgeliefert.
Lad dir das Ding doch mal und schau nach, ob es vielleicht klappt, wenn du die Server-Jars in den Classpath mit aufnimmst.

Und wenn das auch nicht geht: Schon mal über Alternativen nachgedacht? Warum muss es überhaupt (das meiner bescheidenen Meinung nach potthässliche) PHP sein?


----------



## tfa (17. Sep 2010)

> Und wenn das auch nicht geht: Schon mal über Alternativen nachgedacht? Warum muss es überhaupt (das meiner bescheidenen Meinung nach potthässliche) PHP sein?


Das kann ich nur unterstützen.


----------



## ice-breaker (17. Sep 2010)

destroflyer hat gesagt.:


> Denn alleine mit dem Vierzeiler wird eine Fehlermeldung geschmissen, da *phpEngine* null ist (_da das ganze andere zeug noch nicht installiert ist_)



natürlich ist phpEngine null wenn du die Quercus.jar nicht einbindest. Das ganze Webserver-Zeug benötigst du nur, wenn du auch wirklich PHP über HTTP machen willst.

In der WAR-Datei steckt irgendwo die quercus-Scriptengine drinne, also mit WinRar öffnen und die richtige Jar suchen.
Edit: in der resin.jar steckt es drinne, also einfach die jar einbinden und nochmal alle ScriptEngines auflisten lassen.


----------



## destroflyer (18. Sep 2010)

Danke dir vielmals. 
Allerdings bekomme ich immernoch einen Fehler:

```
Exception in thread "main" java.lang.RuntimeException: java.lang.NoClassDefFoundError: javax/servlet/ServletInputStream
        at com.caucho.quercus.script.QuercusScriptEngine.eval(QuercusScriptEngine.java:166)
        at com.caucho.quercus.script.QuercusScriptEngine.eval(QuercusScriptEngine.java:179)
        at javax.script.AbstractScriptEngine.eval(AbstractScriptEngine.java:247)
```

Wahrscheinlich muss ich noch eine *.jar-Datei einbinden, oder? (Die, die sich um das Servlet kümmert)

Gruß, destro 

*EDIT:* Es klappt  Juhu^^ Ich hab einfach mal per Zufalle die *.jar-Datei 'servlet-api.jar' aus Tomcat in den Klassenpfad eingebunden und TADAA^^ Es funzt 
*EDIT²:* Wie kann ich den generierten Code in einem String abspeichern bzw. anzeigen lassen. *eval* gibt den im Moment immer nur in der Ausgabe aus und von der Funktion zurückgegeben wird nur *null*. (_Eventuell mit ScriptContext?_)
*EDIT³:* OK, jetzt klappt es perfekt.  Ich habe mithilfe von *setWriter(new FileWriter(..))* den Code in eine Datei geschrieben, die ich dann auslese... Alternativ würde auch in einem String speichern gehen (_mithilfe eines Streams_), allerdings brauchte ich sowieso später eine Datei^^
Nochmals Danke an alle, die mir geholfen haben. ​


----------

