Sei sulla pagina 1di 3

Contare i lettori di Feed con PHP + MySQL

v0.2

Molti lettori leggono le news utilizzando i Feed Reader. Attraverso questa tecnica, relativamente
nuova, risulta un po piu' complesso riuscire a capire quante persone accedono alle nostre
informazioni senza pero' mai aprire il nostro sito. Durante CenaSicura 2007 ho chiesto ai
partecipanti come pensavano potessi risolvere questo problema che mi gira per la testa da quando
ho appreso che neanche punto-informatico riesce a tener traccia di questi utenti. La risposta pronta
che ho ricevuto da tutti è: ma usa feedburner.com. Questo credo stia diventando un grosso
problema. Moltissimi ricorrono alle applicazioni web 2.0 per ogni cosa e credo sia un approccio
sbagliato. A volte è bello anche staccare la spina dalla rete e rendersi autonomi. Ho pensato un po a
delle soluzioni, e la migliore che sono riuscito a realizzare ora ve la spiego e se avete dei
suggerimenti non esitate, mandate una email. Ah, credo che la mia soluzione sia meglio di
FeedBurner, poi vi spiego i motivi.

In sostanza si tratta di creare un codice identificativo per ogni feed letto.

1) Funzione per generare un possibile identificativo per un utente:

function feed_id(){
//Se non ha un id_feed, generalo

while(!$_SESSION['id_feed_news']){
$tmp = rand(0,9999999999);
$res = db("SELECT 'id' FROM `feed_news` WHERE id = '".$tmp."';");
$value = mysql_fetch_array($res);
if ($tmp != $value['id'])
$_SESSION['id_feed_news'] = $tmp;
}
}

2) Modifichiamo il tag HTML relativo al feed:

<link rel="alternate" type="application/rss+xml" title="GeekPlace.org - News"


href="http://geekplace.org/moduli/rss/rss_news.php?cod=<?php echo $_SESSION['id_feed_news'];
?>" />
3) Per avvertire i nostri cari utenti iscritti al feed “vecchio stile” che ci sono stati degli
aggiornamenti, inseriamo nel rss_news.php (file che crea l'xml) il seguente codice:

//__________// Se non usa il codice di identificazione lo blocco e lo avverto.

if (!$_GET['cod']) {
header("Content-Type: text/xml; charset=ISO-8859-1");
$result = '<?xml version="1.0" encoding="ISO-8859-1"?>
<rss version="2.0">
<channel>
<title>GeekPlace - News</title>
<link>http://www.geekplace.org</link>
<description>News da Geek</description>
<language>it</language>
<copyright>Copyleft 2006 geekplace</copyright>

<item>
<title>ATTENZIONE! DEVI AGGIORNARE IL FEED DI
GeekPlace!</title>
<link>http://geekplace.org/</link>
<description>A causa di alcuni cambiamenti tecnici, sei
invitato ad aggiornare il feed. Questo risulta disabilitato!</description>
</item>
</channel>
</rss>';
echo $result;
return;
}

4) A questo punto entra in gioco il log “morbido”, cioè senza essere troppo invasivi,
memorizziamo dal file rss_news.php (file che crea l'xml) al nostro database (rigorosamente
libero come ad esempio MySQL) nel seguente modo:

//__________//Conto con gli identificativi i feed reader

$req = "SELECT id FROM `feed_news` where id = ".$cod.";";


$res = db($req);
$value = mysql_fetch_array($res);
if ($value['id']) {
$req = "UPDATE feed_news SET data_ultimo_utilizzo = '".$ya.$ma.$da."' WHERE
id = ".$value['id'].";";
db($req);
}
else {
$req = "INSERT INTO `feed_news` (`id`, `data_ultimo_utilizzo`) VALUES
('".$cod."', '".$ya.$ma.$da."');";
db($req);
}
Update 1
Un modo per essere piu' fiscali sul conteggio dei lettori dei feed è calcolare questi ultimi solo dopo
che hanno effettuato un tot di richieste. La base dati dunque avra' la seguente struttura:
Lettori_Feed(Codice,Richieste,Data_ultimo_utilizzo)

FINE

Ora vorrei fare alcune considerazioni.


Innanzitutto con questo metodo, se un utente usa un servizio web per leggere i propri feed o se si
trova dietro una nat, e comunque in molti altri casi di presunto anonimato, noi siamo in grado di
riconoscere il singolo utente in modo estremamente preciso. Le percentuali di collisione sono
minime e personalizzabili e variano a seconda della quantita' di utenti presenti nello stesso
momento nel sito. Inoltre questa tecnica non appesantisce il DBMS salvando il prima possibile nella
SESSIONE un identificativo valido. Ad ogni richiesta di lettura del feed, il nostro “generatore di
feed” controlla se l'identificativo è gia' conosciuto, ed in caso contrario lo crea ed inizia ad
aggiornare la data di ultimo utilizzo. Con questa informazione possiamo capire quando un
identificativo è stato abbandonato e quindi rimuoverlo dalla nostra base di dati riducendo cosi a dati
piu' reali le statistiche dei nostri lettori di feed. Do per scontato che facciate dei controlli di SQL
INJECTION sul parametro cod ad esempio, e altre piccole precauzioni del genere :)
Ricordo infine che questo “articoletto” è a puro fine divulgativo, non vuole essere ne una guida, ne
un tutorial, bensi' uno spunto di riflessione scritto in una notte eccessivamente lunga.

A presto, NeCoSi

RINGRAZIAMENTI

Jek ed Insomnia_