Existen dos formas diferentes de integrar PHP y Java: en primer lugar,
se puede integrar PHP dentro de un entorno
de ejecución de servlets de Java, que en estos momentos es una solución más estable y más eficiente.
La segunda opción es la de integrar Java dentro de PHP. La primera forma de integración se realiza a traves de un módulo SAPI que actua como interfaz del servidor de servlets. La segunda forma se realiza mediante esta extensión de Java.
Esta extensión es
EXPERIMENTAL. Esto significa que el
comportamiento de esta extensión, los nombre de sus funciones y
en definitiva TODO lo documentado sobre esta extensión, puede
cambiar en una futura versión de PHP SIN AVISO. La advertencia
queda hecha, y utilizar esta extensión queda bajo su propia
responsabilidad.
En PHP 4 la fuente de las extensiones
PECL pueden encontrarse en el directorio
ext/ que se existe en las fuentes de PHP o en el
enlace PECL de arriba.
Para incluir el soporte de Java en PHP, es necesario añadir el
parámetro --with-java[=DIR] a las
opciones de configuración de PHP, donde DIR apunta al directorio base
de instalación del JDK. Esta extensión solamente puede ser
construida como un módulo compartido. En el archivo
php-src/ext/java/README se incluye mas información
sobre como construir esta extensión.
Los usuarios de Windows deben activar la opción php_java.dll en el fichero
php.ini para poder utilizar estas funciones.
En PHP 4, esta DLL se
encuentra en el directorio extensions/ que existe
en los binarios de PHP para Windows.
Podeis descargar esta
DLL de las extensiones PECL
desde la pagina PHP
Downloads o desde
http://snaps.php.net/.
Nota:
Para poder trabajar con este módulo en un entorno Windows con una versión de PHP <= 4.0.6,
se debe hacer accesible el archivo jvm.dll desde el PATH del sistema.
Para versiones de PHP > 4.0.6 no es necesario realizar esta operación.
<?php // se obtiene la instancia de la clase de Java java.lang.System desde PHP $system = new Java('java.lang.System');
// ejemplo de acceso a las propiedades de Java print 'Version de Java='.$system->getProperty('java.version').' <br>'; print 'Desarrollador de la JVM=' .$system->getProperty('java.vendor').' <br>'; print 'Sistema Operativo='.$system->getProperty('os.name').' '. $system->getProperty('os.version').' on '. $system->getProperty('os.arch').' <br>';
// ejemplo de java.util.Date $formatter = new Java('java.text.SimpleDateFormat', "EEEE, MMMM dd, yyyy 'at' h:mm:ss a zzzz");
Al acceder a los miembros de una instancia, en primer lugar se
buscarán las propiedades del bean y en segundo lugar los
miembros publicos. En otras palabras, print $date.time
se intentará resolver en primer lugar como $date.getTime()
y posteriormente como $date.time.
Tanto los miembros estáticos como los miembros de una instancia de un
objeto pueden ser accedidos utilizando la misma sintaxis. Ademas, si el objeto
es de tipo java.lang.Class, entonces se puede acceder
a los miembros estaticos de la clase (tanto los atributos como los metodos).
Las excepciones que se lanzan durante la ejecución se
transforman en avisos de tipo "warning" de PHP y en resultados de tipo NULL.
Los avisos de tipo "warning" se pueden eliminar añadiendo el prefijo
"@" a la llamada del metodo. Las siguientes funciones de la API se pueden
utilizar para obtener y borrar el ultimo error surgido:
La resolución de la sobrecarga es uno de los problemas mas
dificiles de resolver dadas las grandes diferencias entre PHP y Java
en el tema del "tipado" de las variables. Esta extensión utiliza un
metodo simple pero muy efectivo para determinar cual es la mejor decisión
a tomar cuando se produce la sobrecarga.
En PHP, las variables de tipo "array" y "hashtable" pueden ser utilizadas de
forma indistinta. En PHP, las hashtables solo pueden incluir en las
claves variables de tipo integer o string. Ademas, en Java los arrays
cuyas variables son de algun tipo primitivo, no pueden contener huecos.
Por ultimo, se debe recordar que este tipo de variables se pasan por valor,
por lo que pueden llegar a consumir una cantidad apreciable de memoria y de tiempo.
Basandose en el mismo mecanismo que la extension de Java de PHP, la SAPI de
los servlets Java permite ejecutar PHP como un servlet de Java. La ventaja
más significativa de esta forma de actuar es que se aprovechan las
caracterÃsticas de "pooling" y de reutilización de recursos
implementadas por la mayorÃa de servidores que permiten ejecutar servlets.
El archivo php4/sapi/README contiene las instrucciones necesarias
para compilar el modulo SAPI para los servlets Java.
Notas:
Aunque, en principio, este código podrÃa ser ejecutado en cualquier
servidor que permita la ejecución de servlets, solo se ha probado en
el servidor Jakarta/Tomcat desarrollado por la fundación Apache. Por
ese motivo, cualquier información sobre la forma de ejecutarlo en
otros servidores, los errores encontrados, las soluciones planteadas,
etc...sera una información muy apreciada y que animamos a que los
desarrolladores envien a los responsables del desarrollo del proyecto
PHP.
Se pueden producir conflictos entre PHP y SAPI con respecto al
directorio de trabajo. Mientras PHP se está ejecutando, el servidor de
servlets no podrá cargar ninguna clase que se encuentre en el
CLASSPATH si su ruta se especifica de forma relativa y tampoco podrá
encontrar el directorio de trabajo utilizado para las tareas de
administración y compilación de JSP.
Atención técnica y comercial: (54)-11-5031-1111 las 24 hs. los 365 días del año. ToWebs, (c) 2008
Virtucom Networks S.A Av. Belgrano 1586, piso 10 (C1093AAQ) Cap. Fed. Bs. As, Argentina.