Mailinglisten-Archive |
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