PHP: Conectando un WebServer con un AppServer mediante CURL

febrero 13, 2014 0 Por jotave

PHP: Conectando un WebServer con un AppServer mediante CURL

Introducción

Me he encontrado en la necesidad de desarrollar una aplicación web con PHP 5.x bajo el patrón de diseño MVC (Modelo-Vista-Controlador), la cual se encuentra distribuido en 3 servidores físicos distintos (web – aplicaciones – base de datos). La ventaja de esta arquitectura, es proporcionar mayores niveles de seguridad al sistema, ya que el usuario a través de su navegador web, solo tiene acceso al servidor web, sin comprometer el servidor de aplicaciones (AppServer) ni el de bases de datos. Uno de los problemas de esta  arquitectura, es la comunicación y el intercambio de mensajes entre servidores y en consecuencia, es necesario considerar la velocidad de la red usada.

PHP CURL webServer appServer

PHP CURL webServer appServer

Para poder implementar la conexión entre los servidores del sistema, he recurrido a la librería cURL, la cual es una herramienta para usar en un intérprete de comandos para transferir archivos con sintaxis URL, soporta FTP, FTPS, HTTP, HTTPS, TFTP, SCP, SFTP, Telnet, DICT, FILE y LDAP. cURL soporta certificados HTTPS, HTTP POST, HTTP PUT, subidas FTP, continuación de transferencia de archivos, tunneling de proxy http y muchas otras prestaciones. cURL es open source/software libre distribuido bajo la Licencia MIT. 

¿Cómo lo hago?

PHP CURL webServer appServer

PHP CURL webServer appServer

Es necesario comprender, como funciona CURL para poder desarrollar al menos una prueba sencilla y validar su funcionamiento. Básicamente a través de la librería CURL se crea un canal de comunicación entre 2 servidores ($_POST, $_GET), a partir de este, los mismos podrán intercambiar datos para realizar tareas  de un lado o de otro, retornando dependiendo del caso, una variable, un arreglo o un objeto. A continuación una diagrama sencillo de como funciona CURL.

PHP - CURL - WEBSERVER Y APPSERVER

PHP – CURL – WEBSERVER Y APPSERVER

Ejemplo práctico CURL

Vamos a desarrollar un ejemplo en PHP de una página de autenticación de usuarios, la cual recibe los datos de entrada desde un formulario html (webServer/index.html), son procesados por una pagina control (webServer/control/controlAut.php) y validados por otra página PHP (appServer/control/validarUsuario.php) para finalmente dar/negar el acceso del usuario al sistema. Los archivos estarán organizados de la siguiente manera.

WebServer

  • webServer/index.html
  • webServer/control/controlAut.php

AppServer

  • appServer/control/validarUsuario.php

Código Fuente

Ahora veamos el código fuente del archivo webServer/index.html:

[php theme=”” group=”” tab=”” highlight=””]
<html lang=”es”>
<head>
<meta charset=”utf-8″>
<meta http-equiv=”X-UA-Compatible” content=”IE=edge,chrome=1″>
<title>Autenticación</title>
<link rel=”stylesheet” href=”web/css/styleLogin.css”>
</head>
<body>
<section>
<div>
<h1>Inicio de sesión</h1>
<form method=”post” action=”webServer/control/controlAut.php”>
<p>Indicador:<input type=”text” name=”indicador” value=”” placeholder=”Indicador de red”></p>
<p>Contraseña:<input type=”password” name=”contrasena” value=”” placeholder=”Contraseña de red”></p>
<p><input type=”submit” name=”commit” value=”Entrar”></p>
</form>
</div>
<div>
</div>
</section>
</body>
</html>[/php]

Ahora veamos el código fuente del archivo webServer/control/controlAut.php:

[php theme=”” group=”” tab=”” highlight=””]

<?php

$appServer = “http://appServer/control/validarUsuario.php”;
$datosEnviados = array(“indicador”=>$_POST[‘indicador’], “contrasena”=>$_POST[‘contrasena’]);
$curlResource = curl_init();
curl_setopt($curlResource, CURLOPT_URL, $appServer);
curl_setopt($curlResource, CURLOPT_POST, 1);
curl_setopt($curlResource, CURLOPT_POSTFIELDS, $datosEnviados);
curl_setopt($curlResource, CURLOPT_RETURNTRANSFER, 1); // Retornar la pagina de resultados en una variable
$datosObtenidos = curl_exec($curlResource);

//Datos obtenidos unserialize(array) al retornar el llamado de la pagina validarUsuario.php
$datosObtenidos = unserialize($datosObtenidos);
curl_close($curlResource);
echo $cm = $datosObtenidos[‘codigoMensaje’];
echo $des = $datosObtenidos[‘descripcionMensaje’];

?>

[/php]

Ahora veamos el código fuente del archivo appServer/control/validarUsuario.php:

[php theme=”” group=”” tab=”” highlight=””]

<?php
$indicador = $_POST[‘indicador’];
$contrasena = $_POST[‘contrasena’];
$result = $client->iniciarSesion($indicador, $contrasena);

$cm = $result->codigoMensaje;
$des = $result->descripcion;
if($result===false){
$cm = ’99’;
$des = ‘Ha habido un error de comunicación con el servidor’;
}
$retorno = array(“codigoMensaje”=>”$cm”, “descripcionMensaje”=>”$des”);

//Datos serialize (array) enviados como respuesta a la página controlAut.php
echo serialize($retorno);

?>

[/php]

Conclusiones

Usando la librería CURL-PHP, he logrado comunicarme entre servidores diferentes, manteniendo niveles aceptables de velocidad de intercambio de información. Espero que esta información sea de utilidad para alguien que como yo, andaba buscando dicha solución.