Depurar PHP con Eclipse

Tags: , , ,

Curioseando un rato ya encontré la forma de depurar PHP con Eclipse. Eso de saber por dónde va el código a base de sentencias echo y var_dump no es muy serio.

La empresa Zend proporciona un “plugin” basado en PDT que incorpora un producto llamado “Zend Debugger”. En el momento de escribir ésto la versión “estable” de PDT es la 0.7, si bien existe una versión 1.0 que sólo funciona con Eclipse 3.3. El plugin que proporciona Zend se basa en PDT 1.0, pero funciona con Eclipse 3.2.

La instalación es muy fácil, en la página de Zend se describe. Sobre una instalación de Eclipse sólo hay que irse al “Update Manager”, poner la URL de Zend (http://downloads.zend.com/pdt) y listo.

Al grano. Veamos cómo se depura.

Tenemos un script muy sencillo (hola.php):

<?
$uno = "Hola, ";
$dos = "mundo";
echo $uno . $dos . "!";
?>

Veamos cómo se depura. Creamos un “PHP Project” y un archivo “PHP file”.

Haciendo doble click en el margen del editor de código se añade un punto de interrupción.

Añadir punto de interrupción

Con el botón derecho, damos al menú “Debug as PHP Script”. Se nos cambia a la perspectiva de PHP Debug y empieza la fiesta: podemos examinar y modificar el contenido de variables, poner más puntos de interrupción, saltar funciones, lo típico en un depurador.

Ejecución interrumpida a voluntad Ejecución interrumpida a voluntad

Lo que todavía no he conseguido es depurar las peticiones enviadas por el navegador (”Debug as PHP Web Page”). Estamos en ello ;-)

Comentarios (2)

Desarrollo de temas para Wordpress

Tags: , , ,

Estoy empezando a cacharrear con Wordpress, su API y la posibilidad de desarrollar temas personalizados.

Ya sé que Wordpress no es la herramienta más adecuada para utilizar como gestor de contenidos (CMS), pero es que me encanta su sencillez y facilidad de uso.

El mayor problema que me estaba encontrando era el siguiente: cuando se tienen varias categorías anidadas, al seguir el enlace de la categoría “madre”, ésta mostraba todas las entradas de sus categorías “hijas”, aunque ella misma no tuviese entradas. Esto está bien para un “blog”, pero no era lo que yo necesitaba.

Lo que quiero es lo siguiente: al “pinchar” en el título de la categoría “madre” mostrar la descripción de la categoría o algo similar si no tiene entradas, pero no mostrar las entradas de sus “hijas”.

Cacharreando un poco, ya he encontrado la manera de hacerlo. Ej. del fichero archive.php:

Estamos “dentro” del código <?php if (have_posts()) : ?> y del <?php while (have_posts()) : the_post(); ?>

La función single_cat_title(”, false) nos devuelve la categoría actual (por ejemplo, el nombre de la categoría “madre”), la función get_the_category() nos devuelve todas las categorías a las que pertenece una entrada, así que sólo hay que comparar si son la misma o no.

Nuestro archive.php queda así, más o menos:

<?php$categoria = get_the_category();
if (single_cat_title('', false) == $categoria[0]->cat_name) {
?>
    <div class="post">
    </div>
<?php  } ?>
Comentarios

Bases de datos con PHP y Perl

Tags: , , , ,

Revisando copias de seguridad me encontré con este artículo. Fue publicado en la revista DLinux de noviembre de 2000. Está totalmente obsoleto, pero puede tener algún interés arqueológico ;-)

He mantenido las erratas y la maquetación (por llamarlo de alguna manera) original.

Artículo: Accediendo a MySQL y Postgresql con PHP y Perl.

Comentarios

PHP orientado a objetos

Tags: , ,

Leyendo el estupendo libro PHP5 & MySQL Bible, en el capítulo dedicado a la programación orientada a objetos con PHP, me encuentro con una nota al margen muy interesante:
“Do Web-Scripting Languages Really Need OOP?”

Sinceramente, creo que a veces se abusa un poco del paradigma de orientación a objetos. Considero que es una herramienta más, pero que no siempre es la más adecuada. En el caso de PHP encuentro que utilizar clases es una forma muy cómoda y limpia de agrupar código y funcionalidades.

Vamos a hacer una pequeña prueba con PHP, a ver qué sale (nota: utilizamos PHP 5). La tarea es trivial: un “script” que pinte una tabla a partir de los parámetros pasados. No hacemos ninguna validación. Es código “guarrete”, sólo para probar.

Versión procedimental, con funciones:

<?php

function pinta_tabla($x, $y) {
    $t0 = microtime(TRUE);
    echo "<table border='1'>";
    for ($i=0; $i<$x; $i++) {
        echo "<tr>";
        for ($j=0; $j<$y; $j++) {
            echo "<td> ($i, $j) </td>";
        }
        echo "</tr>";
    }
    echo "</table>";
    $t1 = microtime(TRUE);
    echo "<p>Tiempo empleado: " . ($t1 - $t0)*1000 . "</p>";
}

pinta_tabla($_GET['x'], $_GET['y']);

?>

Versión orientada a objetos:

<?php

class Tabla {
    var $x, $y;
    function __construct($x, $y) {
        $this->x = $x;
        $this->y = $y;
    }
    function pinta_tabla() {
        $t0 = microtime(TRUE);
        echo "<table border='1'>";
        for ($i=0; $i<$this->x; $i++) {
            echo "<tr>";
            for ($j=0; $j<$this->y; $j++) {
                echo "<td> ($i, $j) </td>";
            }
            echo "</tr>";
        }
        echo "</table>";
        $t1 = microtime(TRUE);
        echo "<p>Tiempo empleado: " . ($t1 - $t0)*1000 . "</p>";
    }
}

$tabla = new Tabla($_GET['x'], $_GET['y']);
$tabla->pinta_tabla();

?>

Vemos que esencialmente, las dos versiones hacen lo mismo. Tienen el mismo número de operaciones de E/S (dos búsquedas de variables GET y seis llamadas a echo).

A priori, sin tomar tiempos, podríamos pensar que la primera versión (procedimental) debe ser un poco más rápida, ya que no crea objetos en memoria ni tiene que buscar métodos en los objetos, etc.

Vamos a probarlo en local utilizando alguna herramienta de “benchmarking” como ab (Apache Benchmark):

Utilizaremos el comando ab -n 100 -c 1 "http://localhost/tabla.php?x=10&y=10", donde:

  • -n es el número de peticiones
  • -c es el nivel de concurrencia

Resultados, para -n 3000 y -c 1:

Petición Tiempo respuesta (ms)
http://localhost/tabla.php?x=10&y=10 2.552
http://localhost/tabla-oo.php?x=10&y=10 2.594
http://localhost/tabla.php?x=100&y=100 40.484
http://localhost/tabla-oo.php?x=100&y=100 43.896

La diferencia al pintar una tabla de 10 x 10 es del 1,65%. Si la tabla a pintar es de 100 x 100, la diferencia es del 7,8%. En este último caso si que se nota más diferencia, pero no nos olvidemos que son milisegundos.

El ejemplo es muy sencillo y realmente casi todo el tiempo de ejecución se dedica a recorrer los dos bucles anidados y a “pintar” datos. Pero nos deja una cosa clara: utilizar clases para organizar o estructurar mejor nuestro código no supone mucha sobrecarga (al menos en estos casos tan sencillos).

Sería interesante repetir los resultados con diferentes versiones de PHP en diferentes S.O. Me lo pongo como deberes …

Comentarios (3)

<- artículos más recientes