PHP para desarrollo de aplicaciones web (I)
Introducción
Bienvenido a esta tercera entrega del curso de programación con PHP. En la primera os avanzamos lo que va a significar la
nueva versión dentro del mundo PHP, la 4.0 y en la segunda os presentamos la librería más potente para desarrollar
aplicaciones en PHP, phplib.
En esta tercera ha llegado el momento de mirar con más detenimiento PHP, sus funciones y para que lo podemos utilizar. En
concreto nos vamos a centrar en las características de PHP principales, detalladas dentro del propio manual de PHP:
- Creación de imágenes GIF gracias a la librería GD
- El uso de las polémicas "cookies" desde PHP
- La autenticación de usuarios utilizando HTTP
- La subida de ficheros utilizando HTTP
Estos temas se tratan en los capítulos 15,16,17 y 18 del manual de PHP, aunque aquí vamos a intentar darle un enfoque más
práctico que el que da dentro del manual de referencia de PHP. En todos los casos vamos a poner ejemplos de aplicaciones
reales que podrían aprovechar estas características de PHP y vamos a analizar los problemas y ventajas de cada una de ellas.
Una vez cubiertas estas funcionalidades básicas, podremos comenzar en futuras entregas a lanzarnos con todas las demás
librerías para acceso a servidores LDAP, IMAP etc. que nos proporciona PHP.
Una de las grandes novedades de PHP ha sido la publicación el día 22 de Mayo de PHP4 de forma oficial. A partir de ahora
veremos un gran bombardeo de información sobre PHP, su nuevo interprete Zend y el alto rendimiento que se logra con esta
nueva versión.
Sin más dilación comenzamos a desglosar los diferentes puntos de esta entrega, esperando que disfrutéis con la potencia y
flexibilidad que ofrece PHP a todos los desarrolladores.
Creación de imágenes GIF desde PHP
Uno de los temas más importantes a la hora de construir un sitio web en Internet de calidad es el aspecto gráfico. Un mal
diseño gráfico, demasiado recargado, con un incorrecto uso de colores, o demasiado pesado (imágenes de muchos kilo-bytes)
puede echar por tierra todo una estupenda idea.
En Internet es difícil lograr que los navegantes caigan por tu página y si lo hacen, es vital que lo que encuentren les llame la
atención lo suficiente como para volver de nuevo allí, y conocer más en profundidad que se le ofrece.
Otro aspecto fundamental es la renovación de la información del sitio web, teniendo mucho cuidado de mantener una imagen
identificativa del sitio, ya que si no es difícil lograr que el navegante pueda llegar a sentirse a gusto en el lugar.
Tanto en el aspecto gráfico como en el de renovación PHP tiene una funcionalidad muy potente: la creación de GIF "al vuelo" (
on the fly). La idea es que los GIF no existen como ficheros en el disco duro del servidor de web, sino que es el propio PHP
el que los genera a partir de información que recibe cuando el usuario acude a la página. De esta forma podemos presentar
información gráfica dinámica. Un ejemplo de esta funcionalidad sería la generación de números para informar del número de
accesos que ha tenido una página.
Otros usos podrían ser el envío a través de un formulario de un conjunto de datos numéricos y la obtención de gráficas de
dichos datos en diferentes formatos.
Otro posible servicio podría ser el permitir que usuarios nos enviaran imágenes "no transparentes" y convertirlas en
transparentes utilizando las llamadas PHP para el tratamiento de imágenes.
Generalizando, la librería de PHP para el tratamiento de GIF permiten montar una serie de servicios y funcionalidades a nivel
gráfico que podemos utilizar para lograr una flexibilidad y potencia muy grandes.
Después de esta pequeña introducción a las posibilidades de la tecnología vamos a ver como se utiliza, la API de estas
funciones de tratamiento de imágenes, y que es necesario tener instalado.
PHP utiliza para este tratamiento de imágenes la librería GD de la empresa Boutell.Com, creada por Thomas Boutell, autor
original de GD. Esta es una librería que se creó inicialmente con el objetivo del tratamiento de GIF. Es necesario que la tengas
instalada en tu sistema. El módulo de PHP de Red Hat incluye por defecto esta librería en PHP así que te habrá obligado el
sistema a instalar GD antes de poder instalar el módulo de PHP. Si tienes otra distribución tendrás que investigar un poco más,
pero lo común será que si tienes instalado PHP, tendrás instala también esta librería. Es importante destacar que se eliminó de
GD el algoritmo de compresión LZW, que había implementado David Rowley, que aunque proporciona mejores resultados
que el actual, tiene el grave problema de la patente software que tiene sobre el Unisys, y que obliga a pagar miles de dolares
por su utilización. Aprovecho esta ocasión para recomendar al lector que profundice sobre el serio problema que constituyen
las patentes software para los desarrolladores, y en especial para los desarrolladores de software libre, y le invitó a que visite
el web de noticias barrapunto.com y busque información sobre las patentes software. Es un tema muy delicado y que aún en
Europa no se ha impuesto.
Imaginemos que tenemos en nuestro sistema instalado PHP, con soporte para GD (la mejor forma de asegurarse es con la
información de respuesta de la llamada a la función phpinfo()) y que queremos empezar a trabajar. El ejemplo más sencillo
será abrir una imagen GIF ya existente en el disco y mostrarla tal cual al usuario. Está claro que esto no tiene mucho mérito, es
lo que hace el servidor de web sin ayuda de PHP, pero es un buen comienzo para lo que va a seguir.
Para lograr este objetivo, el programa PHP es:
// En la cabecera HTTP indicamos que lo que devolvemos es una imagen
// de tipo GIF. Para ello utilizamos el tipo MIME: image/gif
Header("Content-type: image/gif");
// Creamos la imagen a partir de un fichero existente
$im = imagecreatefromgif("images/e3_1.gif");
// Mostramos la imagen
ImageGif($im);
// Liberamos la memoria que ocupaba la imagen
ImageDestroy($im);
Como véis hasta ahora el código es muy sencillito. Se crea un imagen nueva a partir de un GIF que ya existía, se envía al
cliente para que esta la pueda visualizar, y se destruye para liberar toda la memoria que pudiera ocupar, que tratándose de
imagenes puede ser mucha.
Vale, lo básico ya lo sabemos. Pasemos a ver como a partir de una imagen poder pintar encima de ella. En el manual de PHP
nos ponen como ejemplo de funcionalidad que, a partir de un GIF de un botón, se puede ir superponiendo texto. De esta
forma ahorraríamos el trabajos de hacer decenas de botones iguales, pero con un texto diferente. Y si queremos cambiar el
tipo de botón para todo el web, bastará con cambiar una sola imagen. Si, si ya se que estas pensando en que esto es una idea
excelente para poder tener temas diferentes y que cambien a gusto del usuario o del maestro del web. Veamos el código que
nos permite lograr esto.
Supongamos que tenemos una página HTML que para poner los botones utiliza <img src="boton.php3?texto_boton=abrir">
Cada vez que se ponga un botón se va a llamar al programa PHP "boton.php3" y se le va a pasar utilizando el método GET el
texto a visualizar en el botón. El contenido de boton.php3 es:
Header("Content-type: image/gif");
$im = imagecreatefromgif("images/e3_boton.gif");
$orange = ImageColorAllocate($im, 220, 210, 60);
$px = (imagesx($im)-7.5*strlen($texto_boton))/2;
ImageString($im,3,$px,9,$texto_boton,$orange);
ImageGif($im);
ImageDestroy($im);
Creamos con GIMP una imagen de 50x50 pixels, la llenamos con el colore que más nos guste, el aplicamos a través de
"Script-fu" y la opción "Decor" un "Bevel" (un relieve) y guardamos dicha imagen como nuestro botón (e3_boton.gif).
En el código PHP abrimos esta imagen. Luego creamos un color (naranja) utilizando la función ImageColorAllocate de GD. A
continuación echamos cuentas de las dimensiones que ha de tener la cajita para poner el texto. Con la función ImageString
ponemos el texto sobre la imagen y ya lo tenemos. Sólo nos queda visualizarla y liberar los recursos ocupados una vez que la
imagen se ha enviado al cliente.
¿Qué más podemos hacer con la librería GD? Pues en el manual de PHP en la sección XXIII tenemos todas las funciones de
la librería GD disponibles en PHP. Podemos dibujar pixels, arcos, imprimir caracteres, trazar líneas continuas o discontinuas,
crear polígonos, rectangulos, llenarlos con colores...
Para los amantes de las fuentes en las cadenas de textos, la librería proporciona funciones par cargar fuentes de tipo Postscript
y fuentes True Type. Para estas últimas además de GD es necesaria la librería FreeType.
Resumiendo, las posibilidades que brindan estas funciones son múltiples y potentes. El lector puede pensar ahora en las
necesidades de su entorno y ver como puede aplicar esta librería para resolverlas.
El uso de las polémicas "cookies" desde PHP
Las "cookies" son el ejemplo claro de una tecnología muy útil pero de usos un tan peligrosos. Muchas veces se han criticado y
se las ha asociado con la pérdidad de intimidad de los navegantes.
Una "cookie" no es más que una variable que se registra dentro del navegador del internauta. En esa variable se puede
almacenar cualquier información que el usuario haya proporcionado al sitio web: su nombre, dirección, edad, dni, cuenta
bancaria etc. Por supuesto, se puede guardar más de una cookie por lo que si el usuario ha proporcionado información
delicada a un sitio web, y este la almacena en cookies dentro del navegador del internauta, cada vez que el internauta acuda de
nuevo al sitio web, podrá ser identificado por esto y recuperados todos los datos que fueron almacenados en el pasado.
En si mismo esta funcionalidad no es buena ni mala. Si por ejemplo, solemos comprar en una tienda, el tener una cookie nos
puede ahorrar el tenernos que identificar, meter nuestros datos personales cada vez que acudamos etc. Pero si por ejemplo,
tenemos alguna enfermedad contagiosa y visitamos sitios para obtener información, el que se nos pueda identificar es algo no
deseado. Si estos sitios ponen cookies en nuestro navegador, se puede saber que páginas visitamos, con que frecuencia,
cuanto tiempo permanecemos en cada página de forma aproximada, etc.
PHP tiene un excelente soporte para cookies que hace muy sencilla la vida al desarrollador. El poner una cookie dentro del
navegador del usuario es tan sencillo como se muestra a continuación.
setcookie("nombre","Alvaro del Castillo");
echo "Tu nombre es:".$nombre."\n";
Como vemos es muy sencillo definir una cookie en el cliente. Si el navegador de internauta tiene configurado que se rechacen
las cookies, o que se pregunte si se permite aceptarla, las cookies pueden ser controladas. Pero por defecto los navegadores
dejan que las cookies se creen sin que el usuario sea consciente de ello. Recuperar el valor de una cookie desde PHP no
puede ser más fácil. El interprete de PHP crea variables para todas las cookies que envía el cliente hacia el servidor de web y
como es puede ver en el código anterior, el acceso a ellas es como acceder a una variable cualquiera.
Hay que destacar que las cookies se organizan por dominios, es decir, una cookie está asociada a un dominio y es cuando el
usuario accede a cualquier web bajo ese dominio cuando el navegador, de forma automática, envía todas las cookies de ese
dominio al servidor de web.
Un detalle muy importante en las cookies es que pueden tener asociadas una fecha de caducidad. De esta forma los datos que
se almacenan en las cookies dejan de tener validez y de enviarse al servidor pasados un cierto tiempo. Por ejemplo,
imaginemos que tenemos un servicio de pago trimestral. Cuando se comprueba el pago de un cliente se le asigna una cookie
que caducará a los tres meses. Durante esos meses el cliente podrá acceder al servicio, ya que tendrá una cookie que le
autorizará. Si esta cookie no se renueva antes de tres meses, cuando pase este tiempo el cliente dejará de tener acceso al
servicio ya que la cookie dejará de enviarse al haber caducado. Veamos el código que permite hacer esto.
cookie("Acceso",$value,time()+3600*24*90); /* expira en 3 meses */
El tiempo, el tercer parámetro de la función, se introduce en segundos. La función time() nos devuelve los segundos de la fecha
actual. Aumentamos esos segundos en el tiempo que queramos que tenga validez la cookie.
Las cookies se pueden controlar desde PHP de una forma muy sencilla. Es un mecanismo muy potente para proporcionar
estado a un protocolo sin estado como es HTTP, aunque antes de decantarnos por una solución con cookies, deberemos
analizar si es lo más adecuada ya que afecta de forma muy importante a la privacidad de los usuarios de nuestros servicios. En
el siguiente apartado vamos a ver otra posible solución para tener control de quién está visitando nuestro sitio y como lo está
haciendo, aunque como veremos en este caso el usuario meterá un login y clave que le identificaran hasta que cierre el
navegador.