Índice de Contenidos
1. Introducción
El puente PHP/Java es un protocolo de red que permite conectar en ambas direcciones scripts en PHP con clases Java, EJB, VB.NET, C#, JRuby, etc. Es más rápido que RPC via SOAP y que JNI (Java Native Interface). Permite compartir la sesión entre páginas JSP y scripts PHP corriendo en distintos servidores. Los scripts PHP pueden correr en un servidor Apache, IIS, servidor FCGI o un Tomcat.
Enlaces de interés:
- Web oficial: http://php-java-bridge.sourceforge.net/pjb/index.php
- API: http://php-java-bridge.sourceforge.net/pjb/server/documentation/API/index.html
2. Herramientas
Las herramientas necesarias para la instalación en Windows son las siguientes:
- JDK 5.0 Win32 (http://java.sun.com/javase/downloads/index_jdk5.jsp)
- Servidor Apache 2.0.59 Win32. (http://apache.rediris.es/httpd/binaries/win32/apache_2.0.59-win32-x86-no_ssl.msi)
- PHP 5.1.6 Win32 (http://us3.php.net/get/php-5.1.6-Win32.zip/from/es.php.net/mirror)
- Puente PHP/Java 3.1.8 que es independiente del sistema operativo (http://downloads.sourceforge.net/php-java-bridge/php-java-bridge_3.1.8_j2ee.zip?modtime=1157915228&big_mirror=0)
3. Instalación
3.1 Instalación de PHP
Creamos un directorio en C:\PHP y descomprimimos el .zip del PHP que nos hemos descargado.
3.2 Instalación de Apache
La instalación de Apache no tiene ninguna complicación. Cuando nos pida la información de configuración del servidor introducimos lo siguiente:
- Network Domain: localhost
- Server Name: localhost
- Administrator’s Email Address: una dirección de correo
- Install Apache HTTP Server 2.0 programs and shortcuts for: All Users, on Port 80, as a Service
Finalmente si tenemos activado el Firewall de Windows nos bloqueará la ejecución del Apache por lo que debemos desbloquearlo.
3.3 Instalación del puente PHP/Java
Descomprimimos el zip en D:\servidores\php-java-bridge-3.1.8_j2ee
4. Configuración
- Descomprimimos el JavaBridge.war (D:\servidores\php-java-bridge-3.1.8_j2ee) en el mismo directorio donde se encuentra.
- Copiamos el JavaBridge.jar que contiene la API de conexión PHP/Java situado en D:\servidores\php-java-bridge-3.1.8_j2ee\WEB-INF\lib en C:\PHP\ext
- Copiamos la dll java-x86-windows.dll situada en D:\servidores\php-java-bridge-3.1.8_j2ee\WEB-INF\cgi en C:\PHP\ext y la renombramos a php_java.dll para poder utilizar correctamente el puente en Windows.
- Hacemos una copia del fichero php.ini-recommended y lo renombramos a php.ini situado en C:\PHP. Este fichero contiene las propiedades de arrranque de PHP. Añadimos lo siguiente:
- Configuramos las extensiones dinámicas de PHP en la línea extension_dir y añadimos el path C:\PHP\ext
extension_dir = "C:\PHP\ext
- Añadimos en Windows Extensions la dll que acabamos de copiar.
extension = php_java.dll
- Debajo de Module Settings añadimos un módulo para la conexión con Java con las siguientes propiedades.
[java] java.java_home ="C:\Archivos de programa\Java\jdk1.5.0_10\bin" java.java = "C:\Archivos de programa\Java\jdk1.5.0_10\bin\javaw.exe" java.class.path = "C:\PHP\ext\JavaBridge.jar" java.library.path = "C:\PHP\ext" java.log_level = 2
- Editamos el fichero httpd.conf situado en D:\servidores\Apache2\conf y añadimos lo siguiente:
- A continuación de AddType application/x-gzip .gz .tgz añadimos:
AddType application/x-httpd-php .php AddType application/x-httpd-php-source .phps
- A continuación de #LoadModule ssl_module modules/mod_ssl.so introducimos lo siguiente:
LoadModule php5_module "C:\PHP\php5apache2.dll" PHPIniDir = "C:\PHP"
5. Pruebas
Para probar que todo funciona correctamente creamos un script PHP que nos muestra los parámetros de configuración de PHP:
<?php phpinfo(); ?>
Lo guardamos como phpinfo.php en D:\servidores\Apache2\htdocs\pruebas (creamos la carpeta pruebas dentro de htdocs). Para probarlo arrancamos el servidor Apache.
Abrimos un navegador e introducimos http://localhost/pruebas/phpinfo.php. Se nos muestra una página con todos los parámetros configurados para PHP.
Lo más interesante es ver si está correctamente configurado el módulo Java que está un poco más abajo en la misma ventana. Si no os saliera deberéis revisar los pasos en la configuración.
5.1 Llamada a un método Java desde PHP
- Primero creamos una clase de prueba con un método para llamarlo desde un script PHP. Hacemos un clásico Hola Mundo!!
public class HolaMundo { public String saludo() { return "Hola Mundo!!"; } }
Lo guardamos como HolaMundo.java y lo compilamos con javac Holamundo.java
Una vez creado el .class creamos un jar con el comando jar cvf HolaMundo.jar HolaMundo.class
- Ahora creamos el script PHP que llamará al método saludo() de nuestra clase HolaMundo:
<?php java_require('http://localhost/pruebas/HolaMundo.jar'); <- Indicamos dónde se encuentra el jar con la clase HolaMundo $holaMundo = new Java('HolaMundo'); <- Creamos un objeto de la clase HolaMundo echo (String) $holaMundo->saludo(); <- LLamamos al método saludo e imprimimos el resultado ?>
5.2 Llamada a un EJB desde PHP
- Creamos la interfaz remota y el bean de sesión que la implementa. Lo haré con EJB3 ya que resulta muy sencillo.
package src.main.java; import javax.ejb.Remote; @Remote public interface HolaMundoRemote { public String saludo(); }
package src.main.java; import javax.ejb.Stateless; @Stateless public class HolaMundoBean implements HolaMundoRemote { public String saludo() { return "HolaMundo!!"; } }
Creamos un jar y lo añadimos al directorio deploy del JBoss y también en la parte cliente, en este caso en C:\PHP\ext. También añadimos los jars necesarios de la parte cliente del JBoss a C:\PHP\ext (no se detallan estos pasos ya que no son el objetivo principal de este tutorial).
Desde la consola jmx del JBoss comprobamos que se ha desplegado el Bean correctamente:
- Para llamar al Bean remoto desde PHP creamos un script en el que añadimos lo siguiente:
<?php #Declaramos un array con las propiedades de la conexión JNDI $envt = array("java.naming.factory.initial" => "org.jnp.interfaces.NamingContextFactory", "java.naming.factory.url.pkgs"=>"org.jboss.naming:org.jnp.interfaces", "java.naming.provider.url" => "localhost"); #Creamos un objeto InitialContext $ctx = new Java("javax.naming.InitialContext", $envt); #Hacemos lookup para acceder al objeto remoto $obj = $ctx->lookup("HolaMundoBean/remote"); #Llamada al método saludo() del HolaMundoBean, el resultado se guarda en la variable saludo $saludo = $obj->saludo(); #Mostramos el resultado echo "Llamamos a un EJB desde PHP y nos contesta con : "; echo "<br>"; echo $saludo; ?>
6. Conclusión
Como podéis comprobar no es nada complicado unir dos mundos tan distintos como son PHP y Java si dispones del software apropiado. Quizá no sea un buen planteamiento para arrancar un proyecto inicial ya que existen otras herramientas pero sí puede resultar útil a la hora de conectar PHP con otras aplicaciones.
Buenas Tardes. Primero que todo gracias por el tuto. Nose nada de Java pero por razones de un proyect oque estoy realziando debo integrar codigo jav acon mis paginas PHP. La duda que tengo es si este puente funciona en Linux también, es decir cual seria la libreria que se debe configurar en Linux o como sería la configuración del puente.
Espero me haya hecho entender y me puedan ayudar. Gracias
Thanks!
java-x86-windows.dll –> http://php-java-bridge.sourceforge.net/NEWS
Version 3.2.1
(…)
* Since PHP>= 5.2 the Windows java extension (\\\»java-x86-windows.dll\\\»
or \\\»php_java.dll\\\») is not necessary anymore. Please use our pure PHP
PHP/Java Bridge implementation instead.
(…)
lo unico que hizo fue dañarme el xampp y el apache ya no corre ni en broma… jum
buen dia, exelente informacion. pregunto? con esta extension puedo conectar un lector de huellas.
ejemplo desde java genero la comunicacion al lector y le pase la informacion a php
Muchas gracias.
Está muy completo tu trabajo. Te felicito.
estoy en linux y no me aparece la cobnfiguracion de java AYUDA