Webs dinámicos con PHP: Introducción

Introducción a la sección

En mi experiencia como desarrollador de aplicaciones web, PHP ha significado junto al servidor de web Apache, las dos herramientas claves para la creación de aplicaciones.
PHP es un lenguaje sencillo, de sintaxis cómoda y similar a la de otros lenguajes como C o C++, es rápido a pesar de ser interpretado, multiplataforma y dispone de una gran cantidad de librerías que facilitan muchísimo el desarrollo de las aplicaciones.
El código generado es mantenible, se lee muy bien y podemos programar utilizando objetos.
PHP es un lenguaje ideal tanto para el que comienza a desarrollar aplicaciones web como para el desarrollador experimentado, y está alcanzando unos niveles de uso (más de 1 millón de webs lo utilizan ya) que convierten su conocimiento en algo indispensable para los profesionales del desarrollo en Internet.
Y, además, PHP es un lenguaje basado en herramientas con licencia de software libre, es decir, no hay que pagar ni licencias, ni estamos limitados en su distribución y, podemos ampliarlo con nuevas funcionalidades si así lo quisiéramos. Respecto a su licencia, en la versión PHP 3.0 era GPL, pasando a ser modificada en su versión 4.0, por la incorporación de Zend, un nuevo interprete de PHP mucho más rápido que el anterior de PHP. Este interprete Zend tiene asociado un optimizador opcional, el cual ya está más dentro del mundo comercial que del software libre, tema que ha levantado algunas suspucacias dentro de la comunidad de desarrolladores de software libre.

En esta serie de presentación de PHP mostraremos este lenguaje, como se instala y configura, como se desarrolla con él, las librerías fundamentales y como no, su excelente forma de trabajar con casi todas las bases de datos, y en especial, con MySQL, con la que forma un equipo estrella dentro del mundo de desarrollo software.

No olvidaremos por otro lado a PostgreSQL, la base de datos que es realmente software libre, y que avanza con piso firme para convertirse en la base de datos de referencia dentro de cualquier proyecto libre, sobre todo tras la publicación de la versión 7.0.

En los artículos de la serie vamos a describir PHP en su última versión, PHP4, que por fin en Mayo del 2000 ha sido publicada. Posiblemente para cuando el lector comience a desarrollar con PHP, esta versión 4 será la estándar. En ella hay muchos cambios y mejoras que detallaremos a lo largo de los artículos de la serie.

La serie está orientada al uso conjunto de Apache y PHP, aunque PHP se puede compilar como un ejecutable que puede ser utilizado como cgi-bin. De esta forma, cualquier servidor de web que soporte cgi podría ejecutar las páginas PHP. La ventaja que tiene Apache frente a estos es que podemos compilar el interprete PHP como un módulo de Apache, por lo que la velocidad de ejecución de estas páginas PHP es muy superior, así como el consumo de recursos al cargarse el interprete de PHP una sola vez en memoria.

Para estar al día de lo que ocurre en el mundo de PHP tenemos las páginas oficiales de web de PHP, en php.net, y las noticias de PHP que van apareciendo dentro de Barrapunto.com.

¿Qué es PHP?

Con estas siglas nos referimos a un lenguaje de programación que está muy orientado al desarrollo de aplicaciones web. Cuando pedimos a nuestro servidor de web una página PHP, que no es más que un programa PHP que genera HTML, antes de enviar dicha página al cliente se la pasa al interprete de PHP. Este la interpreta y es el resultado de esta interpretación del programa PHP, contenido en la página PHP, lo que termina llegando al cliente.

Supongamos que el contenido de una página web que reside en el servidor, y cuyo nombre es "intro.php", tiene el siguiente contenido:

<? echo "<h1>Mensaje desde PHP</h1>";?>

Cuando un navegador le pida al servidor de web la página "intro.php", el servidor de web va a darse cuenta,
por la extensión ".php", de que esta página ha de enviarse primero al interprete de PHP. Este recibe
el contenido de la página y como resultado de esta ejecución (interpretación) genera una página HTML, que es
la que envía al cliente a través de Apache.

Como veremos en una página PHP se puede mezclar HTML y PHP, algo muy flexible pero que hay que manejar con cuidado ya que puede llevar a confusiones y, sobretodo, a que el equipo que diseñe las páginas web y el que programe la aplicación no puedan ser independientes.

Programar páginas PHP

Lo primero que vamos a hacer es crear una página PHP que nos informe de las características del interprete de PHP que tenemos instalado en nuestro servidor de web. Para ello debemos de crear una página PHP con el contenido siguiente:

<? phpInfo(); ?>

Este debe de ser el contenido de un fichero de nombre "info.php" y que debe de estar en algún lugar accesible por el servidor de web. Quizás lo mejor sea que lo guardes dentro de tú directorio personal web: "/home/tu_login/public_html". Por ejemplo yo lo tengo dentro del directorio "/home/acs/public_html/info.php". Una vez que lo tengas guardado vamos a intentar abrir esta página. Para ello apunta tú navegador a la página: "http://localhost/~tu_login/info.php".

Al pedirle esta página al servidor de web, este al ver su extensión llama al interprete de PHP y le dice que "ejecute" la página y le entregue los resultados. El interprete abre la página y ejecuta la llamada a la función "phpInfo()" que, como resultado, nos entrega toda la información sobre el interprete de PHP en formato HTML. ¿Verdad que es sencillo?.

Vamos con una página algo más complicada. Y vamos con la orientación a objetos. PHP tiene soporte para la programación orientada a objetos, es decir, puedes crear clases para la construcción de objetos, con sus constructores etc. El soporte de objetos que tenemos en PHP no es tan potente como el de C++, pero cada vez es más completo y en esta versión nueva de PHP4 este soporte ha sido mejorado.
Si no sabes programar utilizando objetos en este curso algo vas a aprender pero te recomiendo que sin más dilación consigas algún buen libro o tutorial por Internet. Los objetos cada vez tienen más fuerza a la hora de desarrollar software. De cualquier forma en este curso vamos a utilizar la programación con objetos en un nivel muy básico.

En nuestro siguiente ejemplo vamos a crear un objeto que nos va a permitir acceder a diversas bases de datos. Claro está que lo vamos a dejar sin implementar aún en gran parte, pero todo llegará. Aquí va el código de la página:

<?php
class connection {
    var $dbug=1, $con, $type;

    function getType() {global $type;return $this->type;}

    // Constructor del objeto de conexión a la base de datos
    function connection($typedb="MySQL",$database_name="template1") {
        $this->connection_open ($typedb,$database_name);
    }

    // Apertura de la conexión con la base de datos
    function connection_open ($typedb,$database_name) {
        $this->$type=$typedb;
        if ($type=="PostgreSQL") $this->$con=new postgresql_connection;
        elseif ($type=="MySQL") $this->$con=new mysql_connection;
        else {error_message("Open:Unkown database type");exit;}
        $this->$con->connection_open($database_name);
    }
}

class mysql_connection {
    function mysql_connection() {
        echo "<h1>La clase mysql_connection aún no está implementada.<h1>";
    }
    function connection_open($database_name) {
        echo "<h1>Método connection_open sin implementar.<h1>";
    }
}

$bd = new connection("MySQL","template1");
?>

Si el lector está acostumbrado a la programación con objetos este código le resultará muy familiar. Tenemos una clase principal "connection" que se encarga de gestionar las conexiones con la base de datos. Cuando desde nuestro programa queramos acceder a una base de datos, nos creamos un objeto connection pasándole como parámetros al constructor de connection, método que se llama de forma automática al crear el objeto, el tipo de base de datos al que queremos acceder y el nombre de la base de datos concreta con la que queremos trabajar.
Este objeto delega en los objetos específicos de cada base de datos, el del gestor de base de datos MySQL es "mysql_connection", la apertura de una conexión, las peticiones SQL etc. Esta técnica de utilizar objetos que delegan el trabajo final en otros es muy utilizada en lenguajes que carecen de herencia, mecanismo por el que una clase hereda toda la información de estado y métodos de la clase de a que hereda. PHP3 en sus primeras versiones no tenía soporte para herencia por lo que me vi obligado a utilizar esta técnica. En la actualidad PHP ya soporta herencia, aunque no múltiple. Y no, todas las reglas de encapsulación pública y privada no están implementadas. Y hay que tener cuidado con algo que nos puede dar muchos quebraderos de cabeza: al crear un objeto de una clase B que hereda de una clase A, se llama de forma automática al constructor de la clase B pero no al de su padre, la clase A.

Sobre la sintaxis de PHP, es muy similar a la de C o C++. Quizás lo más destacado ocurre a nivel semántico: el tipado es muy poco estricto, algo típico en los lenguajes "script", y cuando creamos una variable en ella podemos meter el tipo de datos que queramos. Esto es muy flexible y cómodo para el desarrollador, aunque los errores que se cometen pueden ser mucho más graves y difíciles de corregir. Las posibilidades del interprete para detectar incompatibilidades entre variables se reducen mucho y puede ocurrir cosas extrañas en determinadas circunstancias si no tenemos cuidado.

Sobre el código de este ejemplo en concreto, tenemos dos clases. La definición de una clase es hace con la palabra clave "class" seguida del nombre de la clase. Entre llaves desarrollamos toda la descripción de la clase, sus variables y métodos. Dentro de un método de la clase (function) se pueden acceder otras partes de la clase por medio del puntero "$this". Por ejemplo, para acceder desde el método "connection_open" a la variable de la clase "$type" lo hacemos con "$this->$type".

Si guardamos esta clase en un fichero, por ejemplo "ejemploDB.php", cuando accedamos a este fichero a través del servidor de web, este llamará de nuevo al interprete de PHP al ver que la extensión del fichero es "php". El interprete de PHP analizará el código y ejecutará la instrucción ":

$bd = new connection("MySQL","template1");

Con ello se crearía un nuevo objeto de la clase "connection". Al crearse se llama de forma automática al constructor "function connection" que a su vez llama al método "connection_open". Este método crea un nuevo objeto de la clase "mysql_connection" ($con) el cual llama de forma automática a su constructor "function mysql_connection" el cual envía la cadena HTML "<h1>La clase mysql_connection aún no está implementada.<h1>". Desde el método "connection_open" de "connection" se llama a "connection_open" del objeto "$con", que es de la clase mysql_connection, lo que provoca que se imprima otra cadena HTML: "<h1>Método connection_open sin implementar.<h1>.". Tras esta última invocación el programa finaliza y se envía el resultado al servidor de web, el cual reenvía estos datos al cliente.

Más características de PHP

Ahora que hemos visto lo sencilo que es desarrollar con PHP vamos a ver que cosas podemos hacer con él, las librerías de las que disponemos. Muchas de estas librerías ya están orientadas a objetos por lo que su uso será similar al de este ejemplo. Este ejemplo es el que utilizaremos durante el curso para ir introduciendo más conceptos de PHP y en particular, para presentar como se trabaja con las bases de datos MySQL y PostgreSQL.

PHP en cada nueva versión soporta nuevas funcionalidades por lo que el mejor método para ver que nuevas librerías incluye es cuando compilamos. Si dentro del directorio con las fuentes de PHP ejecutamos el comando "configure –help" nos dará información de todas las posibles opciones que tiene PHP al ser compilado y, entre esta información, la de todos los módulos que podemos añadir a PHP si disponemos de las librerías adecuadas. Dentro del manual de PHP disponemos también de una referencia a todas las funciones disponibles. Ojo que muchas veces es necesario compilar PHP de forma especial para incluir soporte para una determinada funcionalidad. Por ejemplo, si queremos acceder desde PHP al gestor de base de datos MySQL, es necesario que a la hora de compilar PHP incluyamos ests soporte. Para ello es necesario tener las librerías de MySQL instaladas en el sistema, normalmente en el paquete "dev" de MySQL, y ejecutar "./configure –with-mysql" antes de compilar PHP. De esta forma PHP incluirá en el módulo generado dicho soporte. En la información que obtenemos con la llamada a la función "phpInfo()" se incluye información sobre los módulos incluidos.

De esta información es importante a versión de API del cliente. Si esta no es compatible con la del servidor que queramos acceder, no podremos acceder a este servidor. En este caso tenemos la versión 3.22 que utiliza el protocolo 10 para comunicarse con el servidor MySQL. Si tuvieramos una versión 3.20 del cliente (la versión de MySQL que se liberó con licencia GPL) no podríamos acceder a los servidores 3.22 ya que el cliente utilizaría el protocolo de comunicaciones versión 9, incompatible con la versión 10.

Siempre que se habla de PHP lo primero que se hace es presentar el gran número de gestores de bases de datos a los que puede acceder.

  • Adabas D
  • dbm
  • dBase
  • filePro
  • Hyperwave
  • Informix
  • InterBase
  • LDAP
  • Microsoft SQL server
  • mSQL
  • MySQL
  • ODBC
  • Oracle
  • PostgreSQL
  • Solid
  • Sybase

Pero si este aspecto resulta impresionante no menos el soporte para:

  • Acceso a servidores IMAP
  • Envío de correo con SMTP
  • Acceso a servidores de FTP
  • Acceso a SNMP para gestión de redes y equipos
  • Generación dinámica de gráficos y documentos PDF
  • Análisis de documentos XML
  • Corrector de ortografíai
  • Genración de datos en WDDX (Intercambio Web de Datos Distribuidos)

Y todo esto ha sido posible gracias a que PHP ha sido diseñado de forma muy modular y ha sido sencillo según han sido surgiendo librerías, utilizarlas desde PHP. Toda esta funcionalidad está basada en librerías que en su mayor parte no han sido desarrolladas por el equipo de PHP. La gente de PHP lo que ha implementado han sido os cabos necesarios para poder acceder a las librerías.

A lo largo del curso iremos presentando el uso de algunas de estas librerías, aunque nada detiene al lector de comenzar este aprendizaje. En el manual de PHP dispone de documentación abundante sobre todas estas funciones, su uso y los posibles resultados. Esta entrega la vamos a finalizar con una descripción de las nuevas características de PHP4, versión que utilizaremos a lo largo de todo el curso.

El nuevo PHP4

La principal novedad de PHP4 es en el interprete del lenguaje PHP. Gracias a Zend, desarrollado por Andi Gutmans y Zeev Suraski, se han logrado aumentos de entre 5 y 10 veces en la velocidad de ejecución de páginas PHP. Este nuevo rendimiento le ha puesto por delante de ASP, la tencología de Microsoft, por lo que le va a permitir competir directamente con ASP en la plataforma de Microsoft. La plataforma de desarrollo Apache+PHP en entornos Microsoft está logrando ya rendimientos superiores a IIS+ASP, por lo que el aumento de su uso en estas plataformas parece muy probable. Esto significará que en el futuro el desarrollador en plataformas NT, por ejemplo, no se verá obligado al uso de IIS+ASP para el desarrollo de sistemas web, tal y como había sucedido hasta ahora. Por otro lado, PHP estaba hasta el momento pensado básicamente para Apache. Era el único que tenía soporte para tener a PHP como un módulo del servidor. Todos los demás servidores de web sólo podían utilizar a PHP como cgi. En PHP4 se han añadido al soporte de la API de Apache, el de Netscape (NSAPI), el soporte para ISAPI ( API de Internet Explorer) y para la API del servidor de AOL. De esta forma todos estos servidores podrán lograr rendimientos similares a Apache en su ejecución de PHP.

Además del aumento en rendimiento en lo referente al soporte de objetos en PHP, la sobrecarga de objetos se ha mejorado. De esta forma se ha añadido la posibilidad de métodos polimórficos, métodos que según desde que referencia a un objeto se llamen se comportan de una forma o de otra. Esta característica es muy importante para incluir soporte para acceder a las arquitecturas CORBA y COM.

Otra nueva característica de PHP4 es que se puede compilar para soportar hebras, algo que no era posible en PHP3. La principal ventaja que podemos obtener de esta funcionalidad es el uso de librerías que utilicen hebras. Y en la mayoría de las implementaciones de CORBA esto es así. Quizás pase ya poco tiempo antes de poder acceder al mundo CORBA desde PHP.

Para el desarrollador con PHP4 se incluye un depurador lo que nos evitará muchos quebraderos de cabeza con PHP. Podremos seguir con mayor profundidad esos errores misteriosos que ocurren en estos lenguajes poco tipados. El nuevo interprete de PHP es capaz de liberar los recursos que reservemos de forma automática con lo que nos podremos olvidar de liberarlos. Sí, esto es algo similar al recolector de basura de Java. Habrá que hacer pruebas para ver que tal funciona porque en el caso de Java, muchas veces da más dolores de cabeza de los que te ahorra.
En la referencia [2] se puede acceder a un informe realizado por Javier Carretero sobre PHP4, el más completo que he encontrado en Internet.

Conclusiones

Esperamos que con esta primera entrega del curso de PHP el lector haya recibido la motivación suficiente como para empezar a utilizarlo. Si algo caracteriza a PHP es su sencillez: en pocos días se puede llegar a ser un desarrollador de PHP bastante profesional.
En las próximas entregas del curso se irán presentando las librerías principales de PHP, las virguerías que se pueden acceder con muy poco código y las noticias que aparezcan dentro del mundo de PHP.

Deja un comentario