PHP: Print vs Echo, ¿qué es más rápido?

20 08 2008

He encontrado en varios sitios la discusión sobre qué función de PHP es mejor a la hora de mostrar cosas en pantalla, “Print” o “Echo”. Yo hasta ahora he usado “print” porque debe ser de lo primero que comprendí de php, no tengo ni idea y al ver “print” en un trozo de código supe enseguida para qué servía esa función.

Pero comprobar efectívamente cuál de las dos funciones es más rápida es muy sencillo, basta con imprimir algo en pantalla muchas veces y comprobar con cuál de las dos funciones tarda más. Para ello, PHP tiene una función muy útil llamada “microtime()” que nos devuelve el tiempo actual del sistema en microsegundos.

Así pues, el código para el experimento es este:

<?php
$date_0 = microtime();
for ($i = 1; $i <= 50000; $i++) {
print '. ';
}
$date_1 = microtime ();
$delta = $date_1 - $date_0;
print "<br/>Tiempo invertido = " . $delta;
?>

Es decir, voy a dibujar en pantalla 50.000 (cincuenta mil) veces un “. ” y comprobaré con qué método, “print” o “echo” obtengo mejores marcas. Repetiré cada experimento 5 veces para obtener una medida más fiable:

Experimento Print Echo
#1 0.004157 0.004018
#2 0.004255 0.004034
#3 0.005847 0.004038
#4 0.004121 0.004025
#5 0.004127 0.004091
Media 0.004501 0.004041

Así que, efectívamente, aunque el número de experimentos ha sido pequeño parece ser que “echo” es más rápido “print”. Eso si, la diferencia es tan sólo de 4.6·10E-10 s en dibujar cincuenta mil veces un punto y un espacio.

En resumidas cuentas, poco parece importar a nivel práctico que usemos una u otra función puesto que la diferencia de tiempo en cada llamada vendría a ser en torno de 1/100.000.000.000.000 segundos. Si alguien es capaz de notar la diferencia, que avise porque a mi me parece que se aproxima muchísimo a CERO.





Estadísticas buenas, bonitas y baratas gratis

2 08 2008

Aunque Drupal tiene su propio sistema interno de estadísticas, este es un poco pobre en algunos sentidos y no nos muestra gráficas de ningún tipo.

Existen módulos que mejoran este aspecto. Sin embargo, en mi opinión, un buen sistema de añadir unas estadísticas muy potentes y de un modo comodísimo es usar el servicio gratuíto statcounter. Entre sus múltiples herramientas tenemos:

  • Gráfica de visitantes (totales, únicos, repetidos)
  • Páginas más populares
  • Lugar de origen
  • Búsqueda con la que se llegó al sitio
  • Duración de las visitas
  • Localización de visitantes
  • Navegador usado por los visitantes
  • etc…
Mapa de visitantes

Mapa de visitantes

Visitantes

Visitantes

Navegadores usados por los usuarios

Navegadores usados por los visitantes

Una de las grandes características del servicio es que no estamos obligados a mostrar ningún banner ni indicativo en nuestro sitio, si lo deseamos, estas estadísticas pasarán 100% desapercibidas para todos los usuarios de nuestra web.

La única limitación que tiene el servicio gratuíto es que los “logs” sólo podrán recoger las últimas 500 entradas. Si deseamos almacenar más datos debemos abonar unos 7-35€ al mes según el número de tamaño de “log” que deseemos.

Instalación

Tras darnos de alta en www.statcounter.com, creamos un proyecto nuevo, indicamos la URL de nuestra web, el tipo de contador que deseamos, si deseamos recibir informes periódicos por correo electrónico, etc…

Una vez hecho, nos suministrarán un pequeño código HTML que debemos insertar en nuestra web para que sea llevada a cabo la recogida de datos.

Dicho código es algo así:

<div id="statcounter_image" style="display:inline;">
  <a class="statcounter" href="http://www.statcounter.com/">
    <img src="http://c41.statcounter.com/xxxxx/0/xxxxx/1/" alt="counter" style="border:none;"/>
  </a>
</div>

Ya sólo queda insertar dicho código en nuestra web. Debería estar incluído en todas las páginas, así que lo más lógico es ponerlo en el pie de página o en un bloque lateral. En cualquier caso, al ser invisible el contador (si lo deseamos), no molestará en ningún sitio.

Como el código está en HTML, debemos cambiar el formato de entrada a “Full HTML”.

Yo lo he puesto en un bloque lateral:

Código de estadisticas dentro del bloque

Código de estadísticas dentro del bloque

El bloque sin rastro visible del contador de estadisticas por ningún lado

El bloque sin rastro visible del contador de estadísticas por ningún lado





Mostrar un número secuencial en los comentarios

1 08 2008
Comentarios numerados

Comentarios numerados

En muchos blogs los comentarios aparecen numerados. Esto es muy cómo a la hora de citar a alguien ya que sin necesidad de mostrar un enlace o añadir una cita podemos responder o comentar lo que cualquier otro usuario haya dicho.

En muy pocos temas de Drupal 5.x viene esta opción añadida por defecto. Incluirla es muy sencillo, en la plantilla comment.tpl.php debemos mostrar la variable $id:

<?php echo $id; ?>

En el ejemplo de la foto, con alguna etiqueta extra para dar mejor aspecto visual la cosa quedaría:

<h2>
  <span class="subtitle">
    #<?php echo $id ?>
  </span>
  <?php print $comment->name ?>
</h2>

El sistema básicamente ya funciona aunque falla con los comentarios divididos en varias páginas. Por ejemplo, si mostramos 10 comentarios por página, el primer comentario de la segunda página debería ser el #11 y sin embargo veremos un #1. El problema es que la variable $id no se almacena en ningún lado sino que se calcula según se dibujan los comentarios en pantalla.

La solución pasa por leer el número de página que estamos leyendo desde la URL ($_GET['page'), multiplicarla por el número de comentarios que mostramos en cada página y sumárle el resultado a $id:

número real = id + numero de pagina * comentarios por pagina

Asi que, finalmente, el código PHP resultante quedaría:

<h2>
  <span class="subtitle">
    #<?php echo $id + ($_GET['page'] * 10); ?>
  </span>
  <?php print $comment->name ?>
</h2>

En mi caso multiplico por 10 ( * 10) debido a que ese es el número de comentarios que muestro en cada página.

Este sencillo sistema tiene una limitación, sólo funciona con los comentarios ordenados cronológicamente de arriba hacia abajo (el orden más natural). El primer comentario sería el #1, el segundo el #2, etc...

Sin embargo, si configuráramos Drupal para que los comentrios se mostraran en orden inverso (orden "antinatural" con el último comentario encima) los números seguirían asignándose según orden de impresión, es decir, que el último comentario llevaría el número #1, el penúltimo el #2, etc... Para solucionar esa inconsistencia, deberíamos obtener del nodo el número total de comentarios y efectuar la resta entre dicho número y el número obtenido del orden de impresión. Es decir:

numero = total_comentarios - id + 1

El último "+1" se añade para que el primer comentario no sea el #0 sino el #1, pero es algo que va a gusto del consumidor.

No pongo el php para este segundo caso ya que no lo uso y tampoco me gusta mucho la opción de comentarios ordenados en orden inverso.

NOTA: He leído que la función "echo" en PHP es más rápida que "print" y por eso la he puesto así, pero cada cual que use la que prefiera, el resultado es el mismo.

NOTA: Gracias a coreyp_1 por solucionarme el problema con los comentarios divididos en varias páginas.