phpbar.de logo

Mailinglisten-Archive

[php] Java-Servlets und multithreading in PHP

[php] Java-Servlets und multithreading in PHP

Johann-Peter Hartmann hartmann_(at)_freecharts.de
Thu, 21 Sep 2000 11:57:54 +0200


Hallo Kar-Wing, hallo Liste,

Kar-Wing Lau schrieb:

> Wir tauschen nur wenige Nutzdaten und auch nur für kurze Zeit
> zwischen Java
> und PHP aus. Werden denn die JVMs denn auch nach ordnungsgemässer
> Bearbeitung eines Aufrufes wieder beendet? Dann dürften die jeweils
> aufgerufenen JVMs zwar den Server schon ein etwas belasten, aber wegen der
> Kurzzeitigkeit würde sich das dann ja in Grenzen halten.

	Ja, sollten sie eigentlich schon .
	Allerdings gibt es hier wohl manchmal Probleme,
	dass pro httpd (in diesem falle etwa = client)
	die JVM nicht wiederverwendet werden.
	Siehe:
	http://bugs.php.net/bugs.php?id=6617
	und
	http://bugs.php.net/bugs.php?id=6122

	Ich hab das Problem auch gehabt :o( .

> Denn der gesamte Rest der PHP-Skripte kommt komplett ohne
> Java-Support aus.
> Daher ist der Overhead nur wegen der Implementierung einer Schnittstelle
> durch Kompilierung von PHP als Servlet à la sapi/servlet etwas ungünstig.

	Ja, imho die richtige Entscheidung, Servlet
	lief bei mir im Test nicht richtig stabil bei
	konkurrierenden Anfragen.

	BTW: Ich hab dank Till endlich kapiert, was
	die Frage nach "Multithreaded" bei der JVM
	meinte: Ja, die Servlet-Variante läuft natürlich
	multithreaded auf den JVMs, die ext/java-Variante
	nicht.

> Des weiteren stellt sich mir die Frage, wie ich denn von einem durch
> ext/java aufgerufenen Servlet über PHP wieder Daten
> zurückbekomme. Ich kann
> zwar Parameter beim Aufruf des Servlets übergeben aber wie bekomme ich ein
> Result von dem Java Servlet? Geht es nur über die Codierung in
> der URL? Dann
> könnte ich meines Wissens mir das ganze ja sparen und Servlets direkt über
> die URL ansprechen.

	Also, Java in PHP:
	ext/java bietet einen Mechanismus zur transparenten
	Nutzung von Java-Objekten in PHP . Das heisst, hier
	wird nicht über URIs/anderes mit Java bzw. einem Servlet
	kommuniziert, sondern direkt mit Java-Objekten gearbeitet.

	Ein Java-Code-Abschnitt könnte im Original z.B. so
	aussehen:


	import org.apache.xalan.xslt.*;

	org.apache.xalan.xslt.XSLTProcessor processor =
        org.apache.xalan.xslt.XSLTProcessorFactory.getProcessor();



	In diesem Beispiel erzeugen wir ein neues Objekt der
	Klasse XSLTProcessor, indem wir es uns von der Klasse
	XSLTProcessorFactory bauen lassen.
	Dasselbe koennen wir auch mit Java in PHP machen:


	<?php

	  $xslprocessorfactory= new
java("org.apache.xalan.xslt.XSLTProcessorFactory");

	  $xslprocessor=$xslprocessorfactory->getProcessor();

	?>



	Über new java() kann man ein Objekt einer Java-Klasse erzeugen.
	Das geht nicht nur mit Objekten, man kann damit auch auf
	Java-Klassen arbeiten.

	Hinter den Kulissen wird hier von PHP beim new java() eine
	JVM, falls noch nicht für diesen httpd vorhanden, gestartet.

	Innerhalb dieser wird das Java-Objekt $xslprocessorfactory
	erzeugt. Dieses Objekt kann jetzt wie ein PHP-Objekt
	angesprochen werden, und natürlich können auch die Methoden
	des Objektes genutzt werden- wie im obigen Beispiel
	"getProcessor()" .

	Auch eine direkte Variablenübergabe funktioniert, String-,
	numerische und Float-Variablen werden transparent für die
	Java-Methoden umgesetzt.

	(Das Overloading hakt trotzdem ab und zu, was durch die
	Unterschiede der Variablentypen der Sprachen bedingt ist.
	Meiner Erfahrung nach läuft es trotzdem sehr stabil, wenn
	man keine Hashes anfasst )


	Bei der Servlet-Variante sieht das PHP-Programm
	absolut identisch aus, dh. aus Sicht von PHP hat sich nichts
	geändert.

	Nur der Hintergrund sieht anders aus:

	PHP läuft hierbei ja selbst als Servlet, also wird die
	Anfrage nicht vom Apache, sondern vom Servlet-Server
	wie etwa Tomcat bedient.

	Dieser weiss ueber die URL Bescheid, dass er PHP-Files
	an das Servlet net.php.servlet übergeben soll.

	Das tut er auch, und bereitet die gesamten Parameter,
	mit denen die Servlet-Maschine aufgerufen wurde, als
	normale PHP-Variablen auf, damit sich das PHP im Servlet
	in einer gewohnten Umgebung wiederfindet.

	Die Datei, also die aufgerufene PHP-Datei, wird jetzt
	vom PHP im Servlet so bearbeitet, wie man es vom
	PHP-Modul oder CGI gewohnt ist.

	Einziger Unterschied: ext/java .
	Hier wird nicht, wie aus dem oberen Beispiel bekannt,
	eine JVM neu gestartet - denn das PHP-Skript selbst
	wird ja bereits von einer JVM bearbeitet.

	Die Java-Objekte, die durch new java() erzeugt werden,
	werden also nicht durch eine neu erzeugt JVM, sondern
	durch die bereits bestehende JVM, auf der das PHP-Servlet
	selber läuft, bedient.

	Das passiert alles innerhalb der JVM, die multithreaded
	arbeitet, also diverse Servlets mit jeweils einem
	Thread bearbeiten kann.

	Deshalb skaliert diese Variante besser als ext/java,
	weil hier mehrere Anfragen auf der gleichen JVM
	bedient werden können.

	Leider fehlte in meinen Versuchen hinreichende Stabilität
	bei vielen parallelen Anfragen. Aber das ist sicher
	nur eine Zeitfrage.

	BTW: es wird also generell nichts ueber eine URL
	transportiert. Der Datenaustausch findet vollständig
	im eigenen Thread/Prozess über das JNI statt.

	So, ich hoffe, hier nicht zuviel Blödsinn erzählt zu
	haben.

	Viele Grüße, johann



php::bar PHP Wiki   -   Listenarchive