lunes, 12 de diciembre de 2011

"Trackeando" iframes en DFP

Llevaba un tiempo pensando cómo se podía hacer esto, es decir, que un anuncio tipo "iframe" pudiese contener en sus URLs el código de seguimiento de Google DFP.



Antecedentes:
Supongamos que tenemos una "creatividad" (que poco me gusta este término) del tipo "terceros" en nuestra cuenta de DFP. El código corresponde a un iframe que sale de nuestro servidor:

http://miservidor.com/anuncios/anuncio1

Y la página http://miservidor.com/anuncios/anuncio1 devuelve el siguiente HTML:





Si creamos en DFP el banner del tipo "terceros" y ponemos el iframe, DFP podrá controlar las impresiones del banner, pero no los clicks, puesto que en ningún sitio hemos insertado la macro correspondiente, típicamente %%CLICK_URL_ESC%%



La solución:

Al llamar al iframe, añadimos como parámetro la macro, esto es:

<iframe src="http://miservidor.com/anuncios/anuncio1?macro=%%CLICK_URL_ESC%%">





Cuando DFP lance una impresión de nuestro banner, la macro será sustituida por el correspondiente código de seguimiento y desde el script que genera el banner, capturar el la url de seguimiento de DFP.

Supongamos que trabajamos con PHP, la modificación sería la siguiente en la página http://miservidor.com/anuncios/anuncio1:

<?php
$enlace = urldecode($_GET['macro']);
?>

<a target="_top" href="http://miservidor.com/articulos/articulo1">


Y eso es todo. En enlace que sale en el iframe ahora tendrá el código de seguimiento de Google DFP, contabilizará el click y redigirá al enlace final, http://miservidor.com/articulos/articulo1


Por supuesto, hay que tomar todas las medidas de seguridad oportunas para evitar problemas (comprobar y sanear el parámetro que llega, etc).

viernes, 9 de diciembre de 2011

phpMemcachedAdmin

He descubierto hace poco esta magnífica herramienta de administración vía web para Memcache.

Tiene un montón de características interesantes: estadísticas de todo tipo, búsqueda de claves, consola de comandos. La instalación y configuración es trivial.

Eso sí, seguridad, ninguna. No es una herramienta que deba estar expuesta, sólo debería utlizarse desde el "backend".


viernes, 7 de octubre de 2011

Utilizando Memcache en Symfony 1.4

Llevaba tiempo buscando un plugin para symfony 1.4 que permitiese cachear en Memcache en vez de en ficheros.

Encontré este, sfMemcachePlugin, pero parece que no está mantenido y no me he atrevido a instalarlo.

En mi aplicación sólo necesitaba cachear los resultados de una consulta especialmente pesada (es una cartelera de cine, la consulta consiste en cruzar todas las películas con todas las poblaciones donde hay cines que la tengan en cartelera).

Mi solución ha sido un tanto rudimentaria pero funciona muy bien:

Primero defino un método estático en una clase "Utilidades" que me devuelve un objeto memcache:
class Utilidades {
public static function getMemcache() {
$objMemcache = new Memcache;
$objMemcache->addServer('servidor1',11211);
$objMemcache->addServer('servidor2',11211);
/* etc */
return $objMemcache;
}
}


Después, en la clase que hereda de Doctrine_Table, defino el método que devuelve los resultados cacheados:

class FooTable extends Doctrine_Table {
public static function getConsultaCacheada() {
$clave = "FooTable-getConsultaCacheada";
$timeout = 3600;
$memcache = Utilidades::getMemcache();
$datos = $memcache->get($clave);
if(!$datos) {
$query = Doctrine_Query::create()->from('Tabla a')->where('...');
$datos = $query->fetchArray();
$objMemcache->set($clave, $datos, null, $timeout);
}
return $datos;
}
}


Super sencillo y funcional ;-)

Haría falta código adicional para controlar errores, etc, pero la idea básica es ésta. Se puede añadir algún parámetro al método como public static function getConsultaCacheada($nocache=false) para poder hacer consultas "frescas" sin tirar de Memcache si es necesario.

Más información del uso de Memcache en PHP en php.net/manual/en/book.memcache.php

jueves, 14 de julio de 2011

Tira nº 76: usuaria avanzada


A ver cuánto tardan en sacar algo así. Sacar algo relativo a la teoría de conjuntos debe ser una tentación muy fuerte :-)