Web Services. El uso de PHP con NuSOAP.

Febrero 7th, 2007 by Eliurkis

¿Qué es un servicio web?

Un Servicio Web es una colección de protocolos y estándares que sirve para intercambiar datos entre aplicaciones. Distintas aplicaciones de software desarrolladas en lenguajes de programación diferentes, y ejecutadas sobre cualquier plataforma, soportando así la interoperabilidad máquina - máquina (interoperabilidad sintáctica) y el intercambio de datos entre redes de ordenadores.
Esta interoperabilidad se consigue mediante la adopción de estándares abiertos.

Estándares empleados

  • Web Services Protocol Stack: Es el conjunto de servicios y protocolos de los Servicios Web.
  • XML: Es el formato estándar usado para los datos que se vayan a ser intercambiados.
  • SOAP o XML-RPC: Protocolos sobre los que se establece el intercambio.
  • Otros protocolos: los datos en XML también pueden enviarse de una aplicación a otra mediante protocolos normales como HTTP, FTP, o SMTP.
  • WSDL: Es el lenguaje de la interfaz pública para los servicios Web. Es una descripción basada en XML de cómo debe establecerse la comunicación de los servicios Web. Es una descripción basada en XML de los requisitos funcionales necesarios para establecer una comunicación con los servicios Web.
  • UDDI: Protocolo para publicar la información de los servicios Web. Permite a las aplicaciones comprobar qué servicios web están disponibles.
  • WS-Security: Protocolo de seguridad aceptado como estándar por OASIS. Garantiza la autenticación de los actores y la confidencialidad de los mensajes enviados.

Pero, ¿qué es NuSOAP?

NuSOAP es una reescritura de SOAPx4, provista por NuSphere y Dietrich Ayala. Es un conjunto de clases (no se requiere ninguna extensión de PHP) que permiten a los desarrolladores crear y consumir servicios web basados en SOAP 1.1, WSDL 1.1 y HTTP 1.0/1.1.
La instalación es bastante sencilla, sólo basta con ir a la página en sourceforge de NuSOAP http://sourceforge.net/projects/nusoap/ y bajar el archivo comprimido. Lo descomprimimos en un directorio de nuestro servidor web (como puede ser “nusoap”), y listo, ya podemos hacer uso de NuSOAP.

¿Cómo lo usamos?

Para responder a esto, lo ideal sería realizar un ejemplo donde utilicemos NuSOAP, lo cual nos permitirá terminar de entender bien los conceptos relaciones con los Servicios Web. Primeramente partiremos de la idea de crear un servicio web, y posteriormente consumir el mismo.
El ejemplo que mostraremos es una aplicación simple, que me permita emitir un saludo a una persona indicada. Para crear este Servicio Web (server.php) con PHP usando NuSOAP es de la siguiente manera:

PHP:
  1. // Incluimos NuSoap
  2. require_once('../nusoap/nusoap.php');
  3.  
  4. // Crear una instancia del soap server
  5. $server = new soap_server();
  6.  
  7. // Inicializar el soporte para WSDL
  8. $server->configureWSDL('holawsdl', 'urn:holawsdl');
  9.  
  10. // Registrar el método
  11. $server->register('hola',               // nombre método
  12. array('nombre' => 'xsd:string'),    // parámetros de entrada
  13. array('return' => 'xsd:string'),    // parámetros de salida
  14. 'urn:holawsdl',                     // namespace
  15. 'urn:holawsdl#hola',                // soapaction
  16. 'rpc',                              // estilo
  17. 'encoded',                          // uso
  18. 'Saludar a quien se desee'          // documentación
  19. );
  20.  
  21. // Definir el método como una función PHP
  22. /**
  23. * Saludar a una persona
  24. *
  25. * @param string $nombre
  26. * @return string
  27. */
  28. function hola($nombre) {
  29. return 'Hola, ' . $nombre;
  30. }
  31.  
  32. // Usar la petición (en caso de existir) para invocar al servicio
  33. $HTTP_RAW_POST_DATA = isset($HTTP_RAW_POST_DATA) ? $HTTP_RAW_POST_DATA : '';
  34.  
  35. $server->service($HTTP_RAW_POST_DATA);

Con este código hemos creado un Servicio Web, que al ser invocado saluda a una persona indicada, ahora debemos crear una aplicación que consuma este Servicio Web (client.php).

PHP:
  1. // Incluimos la clase NuSoap
  2. require_once('../nusoap/nusoap.php');
  3.  
  4. // Dirección del servicio web
  5. $url = 'http://dev.deepinphp.com/ejemplos/webservices/server.php?wsdl';
  6.  
  7. // Creamos una instancia del objeto Soap en su modo Cliente
  8. $soapclient = new soapclient($url, TRUE);
  9.  
  10. // Función "hola" a llamar en el webservices
  11. $function = 'hola';
  12.  
  13. // Parámetros pasados a la función
  14. $params = array('nombre' => 'Pepe');
  15.  
  16. // Llamamos a la función publicada en el servicio web y devolvemos el resultado en $result
  17. $result = $soapclient->call($function , $params);
  18.  
  19. // Imprimimos el resultado
  20. print_r($result);

Y de esta forma, hemos creado una aplicación sencilla de creación y consumo de un Servicio Web en PHP, para mostrar ver su funcionamiento pueden hacerlo en http://dev.deepinphp.com/ejemplos/webservices/client.php

Conclusiones

Los Servicios Web pueden ser muy útiles en ciertos casos concretos de programación. Los expertos de marketing de empresas de software como Microsoft anuncian a bombo y platillo una revolución debido a la aparición de SOAP, WSDL, UDDI, etc. Sin embargo, no conviene creerse todo lo que cuentan. Hay que tener en cuenta que les interesa que sus clientes actualicen sus herramientas de desarrollo a la versión .NET
La única revolución que podemos vivir en relación a los Servicios Web es la de ver como los servidores de Internet hablan entre ellos, y cada día son más independientes del programador. Y eso es algo que va a pasar completamente desapercibido para el resto de los usuarios de Internet.
Si logramos que existan Servicios Web de utilidad, gratuitos y sencillos, este nuevo esquema de comunicación y programación tendrá futuro. Si por el contrario, montamos campañas comerciales y vendemos fantasías en torno a palabras bonitas e incomprensibles como UDDI, WSDL, SOAP, XML, etc, habremos perdido nuestro valioso tiempo.

Archivos de ejemplo

Puede descargar los archivos del ejemplo anterior en http://dev.deepinphp.com/ejemplos/webservices/ejemplo.zip (Incluye la clase NuSoap)

Actualizado: 3 de noviembre del 2008

Posted in PHP, Servicios Web | 24 Comments »

Compresión de archivos utilizando las funciones Bzip2 en PHP

Septiembre 16th, 2006 by Adrian

Beneficios de la compresión
La compresión nos posibilita almacenar mayor cantidad de ficheros dentro de nuestros discos duros, muy útil a la hora de realizar los resguardos de la información. Reduce nuestro tiempo de descarga de ficheros en la red y disminuye el tráfico en las mismas.

¿Qué es Bzip2?
Bzip2 es un gran algoritmo de alta calidad de compresión de datos.
Generalmente hace que los ficheros comprimidos sean entre un 10 y 15 por ciento más pequeños que las mejores técnicas disponibles de compresión. Su patente es libre por lo cual bzip2 esta disponible gratuitamente al igual que su código fuente para el uso de todo el mundo. El sitio oficial se encuentra en http://www.bzip.org y su código puede ser descargado desde la siguiente dirección http://www.bzip.org/downloads.html.
Las funciones bzip2 son usadas en PHP para leer y escribir de forma transparente, ficheros comprimidos bzip2 (.bz2), en nuestro caso solo trataremos con ellas para comprimir y descomprimir ficheros bzip2.

Configurando el php.ini
El soporte para bzip2 en PHP no está habilitado por defecto por lo tanto tendremos que habilitar la opción en el fichero de configuración del php (php.ini). Este se hace eliminando el punto y coma que se encuentra delante de la línea extension=php_bz2.so.

Comprimiendo el fichero
Supongamos que en la variable $archivo_name tenemos guardado el nombre de nuestro fichero a compactar. El siguiente código es el encargado de comprimir el fichero.

PHP:
  1. /*
  2. Abrimos el fichero que deseamos comprimir en modo de lectura binaria
  3. */
  4. $fptr = fopen($archivo_name, ‘rb’);
  5. /*
  6. Luego leemos el contenido completo del fichero y lo almacenamos en la
  7. variable $contenido
  8. */
  9. $contenido = fread($fptr, filesize($archivo_name));
  10. /*
  11. Cerramos el fichero
  12. */
  13. fclose($fptr);
  14. /*
  15. Aquí esta la parte importante del asunto, bzcompress comprime una cadena devolviéndonos los datos codificados como bzip2, el segundo parámetro es opcional y nos indica el nivel de compresión que deseamos, el mismo debe ser un número entre 1 y 9; siendo 9 el máximo nivel de compresión pero usando más recursos para ejecutar la tarea,
  16. el nivel por defecto es 4
  17. */
  18. $bz_datos = bzcompress($contenido, 9);
  19. /*
  20. Ahora en este caso como tratamos de abrir el fichero para escritura se trunca en longitud cero si existe y sino trata de crearlo con el nombre original del fichero mas .bz2, es decir que si tenemos como nombre de fichero a comprimir ‘mifichero.doc’ el fichero comprimido
  21. tendrá el nombre de ‘mifichero.doc.bz2’
  22. */
  23. $fptr = fopen($archivo_name . ‘.bz2’, ‘wb’);
  24. /*
  25. Escribimos en el fichero lo datos comprimidos
  26. */
  27. fwrite($fptr, $bz_datos);
  28. /*
  29. Y finalmente cerramos el fichero y ya tenemos nuestro archivo
  30. comprimido en el formato bzip2
  31. */
  32. fclose($fptr);

Descomprimiendo el fichero
Ahora bien, en este caso supongamos que tenemos en la variable $archivo_fuente el nombre de nuestro fichero comprimido y que en la variable $archivo_destino esta el nombre que deseamos tenga el fichero cuando se descomprima. El siguiente código es el encargado de descomprimir nuestro fichero.bz2

PHP:
  1. /*
  2. Abrimos el fichero que tiene el formato bzip2 que deseamos descomprimir en modo de lectura binaria
  3. */
  4. $fptr = fopen($archivo_fuente, "rb");
  5. /*
  6. Luego leemos el contenido completo del fichero y lo almacenamos en la variable $contenido
  7. */
  8. $contenido = fread($fptr, filesize($archivo_fuente));
  9. /*
  10. Cerramos el fichero
  11. */
  12. fclose($fptr);
  13. /*
  14. Aquí esta la parte importante del asunto, bzdecompress descomprime una cadena que contiene datos codificados en el formato bzip2, bzdecompress también acepta un segundo parámetro opcional, cuando el parámetro es TRUE, se usa un algoritmo alternativo que consume menos memoria (la memoria máxima requerida esta cerca de los 2300K) pero
  15. trabajara aproximadamente a la mitad de la velocidad
  16. */
  17. $bz_datos = bzdecompress($dump);
  18. /*
  19. Ahora en este caso como tratamos de abrir el fichero para escritura se trunca en longitud cero si existe y sino se trata de crear con el nombre que se encuentra en la variable $archivo_destino
  20. */
  21. $fptr = fopen($archivo_destino, "wb");
  22. /*
  23. Escribimos en el fichero los datos descomprimidos
  24. */
  25. fwrite($fptr, $bz_datos);
  26. /*
  27. Y finalmente cerramos el fichero y ya tenemos nuestro archivo sin compresión.
  28. */
  29. fclose($fptr);

Si experimentas problemas a la hora de leer y escribir a ficheros y estas usando la versión de PHP como módulo para el servidor, recuerda que debes asegurar que los ficheros y directorios que estas usando son accesibles al proceso servidor.

Posted in PHP | No Comments »