PHPLIB (I)
Después de la primera entrega de
esta sección donde presentamos PHP4,
vamos a ponernos ya a programar aplicaciones
utilizando PHP. Y PHP no es más que
un lenguaje y un conjunto de librerías
orientadas hacia el desarrollado de
aplicaciones web. Todo lo que podemos
hacer con PHP lo podríamos hacer exactamente
igual con otro lenguaje utilizando
CGI, pero la complejidad y tiempo
de desarrollo serían mucho mayores
y su integración con el web mucho
menor.
Quizás podamos ver PHP como una extensión
de HTML del lado del servidor. Recordemos
que en principio el lenguaje PHP se
mezcla con HTML en una página HTML
con extensión ".php". Es precisamente
esta extensión la que alerta al servidor
de web para que antes de entregar
la página al cliente, se la pase al
interprete de PHP para que ejecute
las partes PHP y envíe al cliente
el HTML y los resultados de las partes
PHP. A lo largo de esta entrega nos
vamos a centrar en describir PHPLIB,
una librería que nos va a permitir
de forma sencilla poder trabajar con
diferentes bases de datos de forma
transparente, poder gestionar sesiones
de una forma sencilla y llevar un
control de acceso muy flexible basado
en bases de datos. PHPLIB también
proporciona clases, está basada en
objetos, para gestionar plantillas
y crear HTML desde PHP. Como veremos
uno de los problemas fundamentales
con lenguajes como PHP, donde se mezcla
el código PHP con el código HTML,
es que no está bien delimitado el
campo del diseñador HTML y del programador
y que el código resultante puede ser
complejo de entender y por o tanto,
muy complicado de mantener. Las plantillas
permiten que el código HTML esté totalmente
fuera del código PHP con lo que el
resultado final es mucho más flexible
y mantenible.
PHPLIB es una librería GPL y se puede
obtener en la referencia [1]. Su instalación
es un tanto compleja ya que toda su
funcionalidad principal utiliza base
de datos. Por lo tanto lo primero
es tener una base de datos funcionando
en el sistema. Nos vamos a centrar
en MySQL pero la instalación sería
muy similar para PostgreSQL o MS Access.
Una vez que hayamos obtenido el "tar.gz"
de la librería la descomprimimos en
un directorio (tar xvfz phplib-7.2.tar.gz
) y pasamos a instalarla. La estructura
de directorios resultante es:
CHANGES COPYING HELP README VERSION pages stuff
COMMIT CREDITS Makefile TODO doc php unsup
La documentación de la librería es
de los más completa y se encuentra
en el directorio "doc". Las clases
que componente la librería se encuentran
en el directorio "php" y los "scripts"
de creación de base de datos y tablas
necesarios para el funcionamiento
de la librería y el soporte de LDAP
se encuentra en el directorio "stuff".
En el directorio "pages" tenemos unos
sencillos ejemplos para comenzar a
trabajar con la librería y en "unsup"
tenemos utilidades de las que no se
da soporte, es decir, que pueden ser
útiles pero que no son parte de la
distribución oficial. Sobre la licencia
como ya dijimos es software GPL y
por lo tanto dentro de "COPYING" tenemos
la querida licencia GPL.
El índice de la documentación lo
podemos ver en la siguiente figura.
La guía de instalación rápida nos
cuenta en 10 pasos como instalar la
librería. Como ya dijimos lo primero
es tener una base de datos funcionando
en el sistema. Quizás puede parecer
un requisito excesivo pero los servidores
web sin base de datos serán una especie
en extinción en el futuro cercano.
Si tenemos MySQL instalado todo va
a ser sencillo. Accedemos al directorio
"stuff" y ejecutamos:
mysqladmin -u root create phplib
mysql -u root < create_database.mysql
Con ello creamos una base de datos
para PHPLIB y dentro de ella la poblamos
con una serie de tablas. En estas
tablas es donde PHPLIB guarda toda
la información de sesiones y control
de accesos. Una vez que ya tenemos
la infraestructura de base de datos
preparada hay que indicar a PHP que
en todas las páginas incluya el núcleo
de PHPLIB. Se puede evitar hacer esto
pero es muy cómodo tener toda esta
funcionalidad de forma automática
en nuestras páginas PHP, y este núcleo
es bastante reducido. Esto lo vamos
a lograr accediendo al fichero de
configuración de PHP, normalmente
"/etc/php.ini", e incluir en la línea
que comienza con "auto_prepend_file"
la localización del fichero "prepend.php3"
que se encuentra dentro del directorio
"php" de PHPLIB. De esta forma el
interprete de PHP incluye PHPLIB en
todas las páginas PHP. Una vez hecho
esto solo nos queda acceder al fichero
"local.inc" y especificar los datos
necesarios en la clase "DB_Example"
para que PHPLIB puede acceder a la
base de datos. El contenido de esta
clase es:
class DB_Example extends DB_Sql {
var $Host = "localhost";
var $Database = "phplib";
var $User = "root";
var $Password = "";
}
Tenemos que especificar en que máquina
está corriendo la base de datos, como
se llama la base de datos en la que
se van a almacenar los datos de PHPLIB,
y un usuario y clave para acceder
a esa base de datos. La clase DB_Sql
es una abstracción del acceso a la
base de datos, es decir, que a través
de esta clase podemos acceder de forma
idéntica a varios tipos de bases de
datos diferentes. En concreto en la
versión actual de PHPLIB nos encontramos
implementaciones de DB_Sql para las
siguientes bases de datos:
db_msql.inc: msql
db_mssql.inc: MS SQL Server
db_mysql.inc: MySQL
db_oci8.inc, db_oracle.inc: ORACLE
db_odbc.inc: ODBC
db_pgsql.inc: PostgreSQL
db_sybase.inc: Sybase
Si basamos nuestros desarrollos en
PHPLIB y DB_Sql la migración de un
sistema de bases de datos será trivial:
sólo habrá que traspasar los datos
y cambiar la clase con la que se accede
a la base de datos. Todo nuestro código
será idéntico.
Control de sesiones
Ya en este punto estamos en disposición
de utilizar la librería PHPLIB. Para
ello lo mejor es poner el directorio
"pages" de la distribución en algún
lugar desde el que el servidor de
web pueda acceder a él y a través
de un navegador acceder a la página
"index.php3". El resultado tiene que
ser similar al de la figura 2.
Si prueba el lector a recargar la
página verá que el contador que aparece
va aumentando. Lo que está ocurriendo
es que la primera vez que se accedió
a esta página se creó una "cookie"
para el control de la sesión. A partir
de este momento está "cookie" con
el identificador de sesión es enviado
al servidor de web por el cliente
cada vez accede a la página permitiendo
el control del estado de la sesión.
De hecho este control se realiza utilizando
la base de datos "phplib" que creamos
anteriormente. Si vemos las tablas
que hay en la base de datos "phplib"
encontramos:
active_sessions
active_sessions_split
auth_use
auth_user_md5
db_sequence
En la tabla "active_sessions" es
donde se almacena la información de
sesión y cada vez que se crea una
nueva sesión, se crea un registro
en esta tabla para su control. Supongamos
que queremos controlar el acceso a
un conjunto de páginas por nuestros
clientes. Con PHPLIB es tan sencillo
como incluir al comienzo de cada página
con control de sesión la llamada:
page_open(array("sess" => "Sesión de control"));
De esta forma PHPLIB verifica si
el usuario tiene ya creada la "cookie".
Si no la tiene se la crea y si la
tiene nos permite acceder a todos
los datos de la sesión. Gracias al
control de sesiones podemos almacenar
diferentes variables asociadas a esta
sesión. Desde el momento que se abre
una sesión, se abren todas las variables
de dicha sesión. Para asociar una
variable a una sesión utilizamos una
llamada de PHPLIB:
$sess->register("s");
Al final de una página con control
de sesión, tenemos que realizar una
llamada a PHPLIB para cerrar la sesión.
En esta llamada todas las variables
asociadas a la sesión se guardan para
que no se pierdan:
page_close();
Es por todos conocido lo poco que
gustan las "cookies" a la gente por
el ataque hacia su privacidad que
supone. Con PHPLIB el control de sesiones
se puede realizar también utilizando
el método GET de envío de datos, es
decir, adjuntando a la URL de acceso
a la página el identificador de la
sesión. Esto se controla si en la
página con control de sesiones ponemos
todos los enlaces a otras páginas
de la siguiente forma:
$sess->purl("showoff.php3");
Ya hemos visto pues una de las principales
ventajas de utilizar PHPLIB: el sencillo
control de sesiones. con este control
el implementar una bolsa de la compra
donde se vayan almacenando todos los
artículos de una compra es trivial.
O el almacenamiento de una barra de
navegación con todas las páginas por
las que ha ido accediendo el usuario.
Control de Identidad de Usuarios
Junto con el control de sesiones
es el control de acceso a páginas
una de las principales necesidades
en las aplicaciones web. Y de nuevo
con PHPLIB tenemos solucionado de
forma sencilla este control. Es cierto
que con Apache tenemos mecanismos
para el control de acceso a páginas,
pero es un control de acceso o no
acceso. Normalmente necesitamos ir
más allá. Necesitamos que según la
persona que acceda dar acceso a unas
partes u otras, poder crear grupos
de usuarios con privilegios etc.
Además PHPLIB asocia este control
de identidad de usuarios al control
de sesiones, algo que nos permite
asociar de forma automática una sesión
a un usuario identificado. Cuando
queremos que una página solo pueda
ser accedida por un usuario identificado
incluimos en la primera línea de esta
página:
page_open(array("sess" => "Example_Session", "auth" => "Example_Auth",
"perm" => "Example_Perm", "user" => "Example_User"));
Es en la tabla "auth_user" de la
base de datos "phplib" donde se almacena
toda la información sobre los usuarios.
Y en esta tabla también se incluye
un campo "perms" donde se pueden detallar
los permisos que tiene un usuario.
Supongamos que hay una parte de administración
a la que sólo pueden acceder los usuarios
con permiso de administrador. Para
ello en el campo "perms" del registro
del usuario debe aparecer "admin".
Con PHPLIB lo único que hay que hacer
para realizar este control es incluir
la llamada:
$perm->check("admin");
Si el usuario no está aún autenticado
se le presentará una página para que
inserte un identificador y una clave
de entrada. Esta página se puede observar
en la figura 3.
En el ejemplo inicial de PHPLIB el
identificador es "kris" y la clave
es "test". Una vez introducidos podemos
volver a acceder a esta página y ya
se nos volverá a pedir el identificador.