Emezeta.com

10 consejos para recodificar una web


Cuando nos dedicamos a la programación de un sitio web, llegará un momento en el que tenemos que renovar la estructura (aquí hablamos de HTML), la presentación (hablamos de CSS) y la codificación y programación interna (hablamos de PHP).

redesign

A continuación una serie de consejos para depurar y realizar una recodificación y rediseño efectivo:

1. Realinear, no rediseñar

Aunque en muchas ocasiones hay necesidad de un rediseño profundo, como resultado de un cambio de estrategia debido a algún factor especial, por norma general es mucho mejor mantener el objetivo de realineación que el de rediseño.

Esto proporciona un efecto más positivo de presentación, en el que estamos manteniendo la mayoría de los elementos en su lugar original (no despista a los usuarios), renovandolo visualmente.

En A List Apart se puede encontrar un claro ejemplo de este punto: Buenos diseñadores rediseñan, Grandes diseñados realinean.

2. Calcula el tiempo que tarda en cargar tu web

A pesar de tener otros sistemas externos como Pingdom, en este caso me refiero al tiempo de generación de código, internamente.

La forma tradicional es aquella en la que, mediante un timestamp UNIX capturado al final de todo, le restamos otro capturado al inicio. Generalmente se utiliza la función microtime.

NOTA: A partir de PHP5, a esta función se le puede pasar un booleano como parámetro para indicar que devuelva un número flotante que indique los microsegundos. En caso contrario devuelve una lista de parámetros (microsegundos y segundos). Ojo a los que aún usen PHP4.

3. Calcula la memoria utilizada en tu web

Análogamente al punto anterior, sería ideal establecer un echo temporal que nos vaya avisando de la memoria consumida en el procesamiento de nuestro script PHP. También podemos establecer unos puntos de control para saber que partes consumen demasiado. Ver punto 6 posterior (Profiling o Debugger).

Para calcular la memoria nos ayudaremos de la función memory_get_usage de PHP. En otros artículos como ¿Cuánta memoria RAM consume mi servidor? o Reducir uso de CPU y memoria del servidor hablo más sobre el tema.

4. La función isset()

Una buena técnica de programación es comprobar siempre la existencia de las variables con la función isset(), una función que nos devuelve un booleano (verdadero si existe la variable o falso en caso contrario), pudiendonos saltar fragmentos de código (y sus correspondientes recursos de proceso) en el caso de que ciertas variables no existan.

Pueden utilizarse para evaluar la existencia de varias variables en cortocircuito, esto es, con una lista de variables, desde que encuentre una que no exista, devuelve FALSE.

5. La directiva error_reporting()

Unos buenos amigos en PHP, son los niveles de error. Con ellos podremos establecer la forma de detección de errores en nuestro código de una manera sencilla y fácil.

En el fichero php.ini se puede establecer de forma general, aunque quizás es más práctico utilizar la funcion error_reporting() para hacerlo en tiempo de ejecución. Con el parámetro E_ALL mostrará todos los errores y warnings en el fichero error_log. Ver punto 8 posterior (error_log).

En Niveles de error PHP puedes encontrar una lista de todos los niveles posibles.

6. Profiling o Debugger

Utiliza un sistema de profiling o depuración de código. Un Profiler es un sistema que se ubica entre el programador y la máquina y le va informando al primero con las estructuras apropiadas y ciertas estadísticas del funcionamiento del código.

Generalmente, los buenos programadores ya hacen buen código. Pero los programadores que usan profilers son aún mejores. Extensiones como APD (Advanced PHP Debugger) pueden ayudarnos mucho, ya que permiten crear hasta una estructura árbol con las funciones utilizadas y el tiempo o memoria consumida.

En LinuxJournal podemos ver algunos ejemplos del APD y la técnica de Profiling en general.

7. Complejidad

Los bucles. Uno de los aspectos más básicos de la programación, y no por ello de los más sencillos, es reducir la complejidad de los procedimientos que llevamos a cabo.

Para ello, lo mejor es partir de la idea más simple y genérica: Localiza todos los bucles (for, while, foreach...) e intenta realizar cuantas operaciones puedas (funciones) fuera del bucle.

Un ejemplo típico es el siguiente bucle:

while (strlen($a) < ($b+$c)) {
echo "valor b: $b c: $c";
$b++;
$c++;
}

Como podemos ver, la variable $a no se modifica dentro del bucle, por lo tanto la función strlen($a) (que da la longitud de la cadena $a) siempre devolverá la misma cantidad en todas las iteraciones del bucle.

La complejidad se reduciría en el siguiente ejemplo:

$d = strlen($a);
while ($d < ($b+$c)) {
echo "valor b: $b c: $c";
$b++;
$c++;
}

Evidentemente, este ejemplo es algo inapreciable. Pero con funciones más complejas y extensas, el resultado puede notarse bastante.

8. El fichero error_log

A parte del fichero access_log de Apache, donde quedan registradas todas las peticiones HTTP de los diferentes usuarios, existe otro fichero muy interesante e importante para estrategias de depuración, error_log.

Dependiendo del nivel de error establecido (Ver punto 5) serán volcados distintos tipos de error, entre los que destaco los siguientes:

  • PHP Notice: Avisos poco importantes como petición de ficheros inexistentes, variables no definidas...
  • PHP Warning: Errores importantes como permisos, funciones no definidas, ejecuciones terminadas...
  • PHP Fatal error: Errores graves como finalización por memoria insuficiente, etc...
  • ModSecurity: Errores de seguridad. Ver artículo ModSecurity.

9. Inclusiones y exclusiones

Otro de los puntos importantes en la programación web es saber excluir o incluir partes de código que son o no necesarias.

Un ejemplo: En el apartado que muestra los artículos por categoría un blog, no es necesario funciones o código para mostrar comentarios, o en un artículo que tiene menos de 25 comentarios (suponiendo que 25 es el máximo por página) no es necesario las funciones para paginación. En muchos casos, esto puede disminuir el proceso de tiempo y memoria consumida en gran proporción.

Además, organizando un poco la codificación se puede evitar el uso de funciones include_once o require_once (incluir si no han sido ya incluidas) en favor de sus respectivas include y require puede ahorrar bastantes recursos.

10. Consultas SQL sin buffer

Generalmente, para la recuperación de consultas SQL en PHP (hablamos de la gestión de una base de datos MySQL) se utiliza mysql_query(). Sin embargo, en ciertos casos se puede hacer uso de la función mysql_unbuffered_query().

Las diferencias es que, al contrario que la primera, la segunda función no utiliza buffer para almacenar todas las filas resultantes de la consulta. Esto produce un ahorro de memoria significativo y también mayor rapidez, ya que permite comenzar a trabajar nada más devuelva la primera fila (no es necesario esperar a que termine por completo).

Es importante recalcar que con este tipo de recuperación no se pueden anidar varias consultas dentro de otras y que tampoco se pueden utilizar funciones como mysql_num_rows() ni mysql_data_seek().

Más o menos estos son los pasos que me han parecido más importantes para recalcar en la recodificación de una aplicación web. Como habrán visto, Emezeta blog ha «sufrido» una en los últimos días, y aunque el cambio de diseño no es demasiado grande, el de rendimiento si debería serlo.