PHP: Conectando un WebServer con un AppServer mediante CURL
febrero 13, 2014PHP: 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.
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?
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.
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.