Open Resources (The Free Source)


Página principal

Revista OR

Noticias OR


Alvaro del Castillo San Félix
Distribuido bajo licencia FDL
Contribuciones

Webs dinámicos con PHP

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.

Instalación de PHP

Sin duda esta sección del manual debe de ser actualiazada ya que se refiere aún a la última beta de PHP4, pero salvo este detalle, el procedimiento sigue siendo válido. También hay que estar atentos a la publicación de Apache 2.0 ya que quizás, implique unos cambios mayores dentro esta sección. Si algún lector quiere contribuir y actualizar la versión será gratamente bienvenida.

Uno de los mayores quebraderos de cabeza de PHP en sus comienzos era que obligaba a tener Apache en código fuente y compilarlo. Por fin la instalación de PHP se puede hacer de forma sencilla y sin tener que modificar en casi nada a nuestro servidor de web. Tan sólo necesitamos tener una versión de Apache con soporte DSO para la carga dinámica de objetos. La versión con la que se está desarrollando este artículo es la 1.3.9 aunque toda la serie 1.3 tiene este soporte.

Si el lector tiene ya instalado PHP3 en su servidor de web Apache debe de tomar la precaución de desactivarlo. Se puede tener de forma simultánea ambas versiones funcionando, pero este proceso es algo complejo y no lo vamos a tratar de momento. Por ello el lector necesita un servidor de web Apache sin soporte para PHP. La mejor forma de comprobar este dato es editar el fichero de configuración de Apache "httpd.conf" (normalmente en el directorio "/etc/httpd") y revisar que no se hagan referencias en él a PHP. Si las encontrara debería de comentarlas y reiniciar el servidor de web

Es necesario que los paquetes de desarrollo de Apache estén también instalados en el entorno del lector. Estos son básicamente los ficheros de cabecera de la librerías de Apache ("/usr/include/apache"), las librerías para extender Apache y algún ejecutable como "apxs" que es una utilidad que permite añadir módulos de carga dinámica a Apache. El resultado de nuestra compilación de PHP va a ser uno de estos módulos.

Ha llegado el momento de obtener la última versión de PHP de la red. Esta la puede conseguir el lector de "http://www.php.net". Una vez que tengamos las fuentes de PHP4beta3 vamos a pasar a instalarla. Los pasos a dar son:

  • tar xvfz php-4.0b3.tar.gz
  • cd php-4.0b3
  • configure --with-apxs=/usr/sbin/apxs
  • make
  • make install (como superusuario)

Si todo ha ido bien ya tenemos todo preparado para poder reiniciar el servidor de web Apache con el módulo de PHP4 entre sus funcionalidades. De la compilación cabe destacar el gran tiempo que transcurre en la compilación de uno de los nuevos componentes de PHP4, Zend, el motor principal para la interpretación del lenguaje PHP.
Si el lector ha estado atento en la fase de "make install" habrá podido observar como se utiliza la herramienta "apxs" para añadir "libphp4.so" a los módulos de carga dinámica de Apache. La instrucción en concreto es:

/usr/sbin/apxs -i -a -n php4 libs/libphp4.so

Esta herramienta copia este fichero al directorio donde residen los demás módulos de carga dinámica, "/usr/lib/apache" normalmente, y modifica el fichero de configuración "httpd.conf" para que se cargue este nuevo módulo al arrancar.
En Mandrake 6.1, y probablemente en RedHat 6.0 y superior, este proceso no incluye de forma correcta la referencia al módulo dentro de "httpd.conf" lo que nos obliga a editar este fichero y modificar la línea con el contenido:

LoadModule php4_module        lib/apache/libphp4.so

por la línea

LoadModule php4_module        modules/libphp4.so

Ahora ya sólo nos queda decirle a Apache que todos los ficheros que acaben con la extensión ".php" sean enviados al interprete de PHP, algo que logramos añadiendo a "httpd.conf" la línea:

AddType application/x-httpd-php .php4

En anteriores versiones de Apache existían tres ficheros de configuración y esta última línea había que insertarla en el fichero "srm.conf".

Reiniciamos nuestro servidor Apache, "/etc/rc.d/init.d/httpd restart" en sistemas Red Hat y si todo ha ido bien tendremos ya todo preparado para empezar a desarrollar con PHP. Si existe algún problema el servidor de web no se arrancará. Para detectar que puede estar ocurriendo se pueden analizar los ficheros de registro de Apache del directorio "/var/log/httpd" e intentar localizar allí el error. A veces también es útil iniciar a mano el demonio de Apache sin la ayuda de ""/etc/rc.d/init.d/httpd", ejecutando de forma directa "/usr/sbin/httpd".
Algo que nos puede confirmar de forma definitiva que todo ha ido bien es una línea de registro dentro de "/var/log/httpd/error_log" con un contenido similar a:

[notice] Apache/1.3.9 (Unix)  (NetRevolution Advanced Server/Linux-Mandrake)
PHP/4.0b3 configured -- resuming normal operations

Si has logrado llegar ya hasta aquí, prepárate porque ahora viene lo divertido: la programación de páginas PHP.

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". En mi caso dicha página es: "http://localhost/~acs/info.php". El resultado que debes de obtener debe de ser algo similar al de la siguiente figura número 1.
Figura 1: Información de configuración de 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. En la figura 2 podemos ver el resultado de dicha ejecución.


Figura 2: Resultado de la ejecución de ejemploDB.php.

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. En la figura 3 se puede observar la información referente al módulo MySQL y al GD, que se utiliza para la creación de gráficos "al vuelo".


Figura 3: Información del soporte de MySQL

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.

Referencias

Free software projects: FreeBSD

OR in English

What's New in OR

OR Dictionary

For your friends


Search for anything at one of our sponsors:



Book of the month

Open Sources: Voices from the Open Source Revolution!