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.