Mi entusiasma la potenza di Java e di vari prodotti quali OpenJMS, Hibernate, Spring, JMX etc. E lo stesso vale per l'approccio semplice, immediato e produttivo del PHP nello sviluppo dei front-end. Uso costantemente entrambi i linguaggi insieme, di solito esponendo servizi Java al PHP tramite SOAP o Xml-Rpc. Ma quanto sarebbe meglio poter istanziare oggetti Java direttamente da uno script PHP?
Negli ultimi anni, a più riprese ho utilizzato l'estensione Java rilasciata con il motore PHP, ma per svariate ragioni non ne sono mai stato pienamente soddisfatto. Recentemente ho scoperto Quercus, un'implementazione del PHP 100% Java integrata all'interno di Resin, il meritatamente noto motore open source di Caucho. E' stata subito un'esperienza molto proficua è ho già spostato alcuni miei applicativi PHP sotto Resin/Quercus senza intoppi. Qui vorrei spiegare passo passo come allestire un ambiente il più simile possibile a quello "nativo" del PHP.
Come fare Dò per scontato che sia già installato un JDK. Ora si può scricare la versione open source di Resin da Caucho e decomprimerla. Da ora in poi mi riferirò alla directory principale di Resin con '%RESIN%' per comodità. Le directory bin,conf e webapps conterranno ciò che ci si aspetta.
Resin ha già un applicativo web di default in webapps/ROOT. Utilizzeremo questo per semplicità. I files PHP in Resin sono gestiti da QuercusServlet, quindi dobbiamo istruire Resin. Creiamo un file web.xml in webapps/ROOT/WEB-INF con il seguente contenuto:
<web-app xmlns="http://caucho.com/ns/resin"> <servlet-mapping url-pattern="*.php" servlet-class="com.caucho.quercus.servlet.QuercusServlet"> <init> <compile>false</compile> </init> </servlet-mapping> </web-app>
Questo è tutto ciò che serve per eseguire semplici script php. Facciamo partire/ripartire Resin e mettiamo in webapps/ROOT/ un file test.php contenente:
e facciamo puntare il browser a http://127.0.0.1:8080/test.php per vedere il risultato di phpinfo(). Ok, abbastanza semplice, ma non un esempio "vero". Quando lavoro in PHP, di solito ho almeno la seguente struttura di directory: - site che è quella pubblicamente accessibile(la document root)
- php che contiene classi accessorie e librerie
(per il momento ignoriamo logs, templates etc.) e di solito ho un file prepend.php che viene eseguito prima di ogni script e che tengo nella directory php con le altre librerie. La directory site in resin è la document root (in questo caso webapps/ROOT/), quindi posso non preoccuparmene; devo invece valorizzare include_path e auto_prepend, normalmente definite in php.ini(o .htaccess) sotto Apache. Qui non abbiamo php.ini, ma dobbiamo usare web.xml, che modificato risulterà così:
<web-app xmlns="http://caucho.com/ns/resin"> <servlet-mapping url-pattern="*.php" servlet-class="com.caucho.quercus.servlet.QuercusServlet"> <init> <compile>false</compile> <php-ini include_path=".:%RESIN/webapps/ROOT/WEB-INF/php" auto_prepend_file="prepend.php" /> </init> </servlet-mapping> </web-app>
In questo caso l'ordine di ricerca per include() o require() sarà prima la directory corrente e poi webapps/ROOT/WEB-INF/php(da creare). Se utilizziamo PEAR o altre librerie, qui dovremo aggiungerne il percorso. Con auto_prepend definiamo prepend.php(da creare), da cercare in include_path. Ora il nostro ambiente è molto più simile a quello abituale con il PHP nativo,ma manca ancora una caratteristica fondamentale: la connettività a database. Nessun problema, ancora una volta è molto semplice. Primo, apriamo %RESIN%/conf/resin.conf e cerchiamo la sezione di database. Troveremo un modello di configurazione per un 'pool' commentata. Decommentiamola e se il motore di db usato è per esempio mysql, modifichiamola ad ottenere qualcosa tipo:
<database> <jndi-name>jdbc/mysql</jndi-name> <driver type="com.mysql.jdbc.jdbc2.optional.MysqlConnectionPoolDataSource"> <url>jdbc:mysql://localhost:3306/your_db_name</url> <user>your_username</user> <password>your_password</password> </driver> <prepared-statement-cache-size>8</prepared-statement-cache-size> <max-connections>20</max-connections> <max-idle-time>30s</max-idle-time> </database>
e salviamo. Non dimentichiamo di scaricare Connector/J e di mettere il jar in %RESIN%/lib. L'ultima modifica va fatta nel nostro web.xml, aggiungendo la seguente riga dentro la sezione "<init>" (quella che contiene anche <php-ini>): <database>jdbc/mysql</database> e salviamo. Tutto qui. Ora, posto che il path di PEAR sia indicato in include_path e che il modulo PEAR DB sia installato, possiamo lanciare uno script come questo:
<?php require_once 'DB.php'; $dbh = DB::connect('mysql', false); if (PEAR::isError($dbh)) { die($dbh->getMessage()); } $results=& $dbh->query("select * from your_table"); while($results->fetchInto($row, DB_FETCHMODE_ASSOC)){ echo "<pre>"; print_r($row); echo "</pre>"; }
?>
Questa è solo metà dell'immagine, dato che la parte più interessante è l'integrazione fra Java e PHP, ma questa è un'altra storia.....
Hasta la proxima. |