Integraci贸n de Java y PHP

LXIV. Integraci贸n de Java y PHP

Introducci贸n

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 de Java proporciona de forma sencilla los medios necesarios para crear e invocar m茅todos sobre objetos de Java desde PHP. La JVM se crea utilizando JNI y todo se ejecuta en un unico proceso.

Aviso

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.

Requisitos

Para utilizar esta extensi贸n es necesario disponer de una m谩quina virtual Java (JVM) instalada en el sistema.

Instalaci贸n

Esta extension PECL no esta ligada a PHP.

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.

Configuraci贸n en tiempo de ejecuci贸n

El comportamiento de estas funciones est谩 afectado por los valores definidos en php.ini.

Tabla 1. Opciones de configuraci贸 de Java

NombreValor por defectoDonde se cambiaRegistro de cambios
java.class.pathNULLPHP_INI_ALL 
java.homeNULLPHP_INI_ALL 
java.library.pathNULLPHP_INI_ALL 
java.libraryJAVALIBPHP_INI_ALL 
For further details and definitions of the PHP_INI_* constants, see the Ap茅ndice G.

Tipos de recursos

Esta extensi贸n no tiene ning煤n tipo de recurso definido.

Constantes predefinidas

Esta extensi贸n no tiene ninguna constante definida.

Ejemplos

Ejemplo 1. Ejemplo de Java

<?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");

  print
$formatter->format(new Java('java.util.Date'));
?>

Ejemplo 2. Ejemplo de AWT

<?php
  
// Este ejemplo solo puede ser ejecutado como CGI.

  
$frame  = new Java('java.awt.Frame', 'PHP');
  
$button = new Java('java.awt.Button', 'Hola Mundo de Java!');

  
$frame->add('North', $button);
  
$frame->validate();
  
$frame->pack();
  
$frame->visible = True;

  
$thread = new Java('java.lang.Thread');
  
$thread->sleep(10000);

  
$frame->dispose();
?>
Notas:

  • new Java() crea una nueva instancia de una clase solamente si existe un constructor adecuado. Si no se le pasan par谩metros, debe existir un constructor por defecto adecuado, como por ejemplo en el caso de java.lang.System que permite el acceso a la mayor铆a de sus funcionalidade a trav茅s de metodos est谩ticos.

  • 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.

    Ademas, los nombres de los m茅todos en PHP no distinguen entre mayusculas y minusculas, por lo que se aumenta eln煤mero de posibilidades para elegir en las situaciones de sobrecarga.

    Una vez seleccionado el m茅todo, los par谩metros se transforman si es necesario, incluso con la posibilidad de perder datos (por ejemplo, los n煤meros de tipo "double" se transforman en tipo boolean) (Nota del traductor: esta conversion parece totalmente absurda, asi que puede tratarse de un fallo de la documentaci贸n de la version original).

  • 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.

SAPI de los servlets Java

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.

Tabla de contenidos
java_last_exception_clear -- Borra la 煤ltima excepci贸n de Java
java_last_exception_get -- Obtiene la 煤ltima excepci贸n de Java