lucliscio/fanKounter

View on GitHub
docs/manual.txt

Summary

Maintainability
Test Coverage

                                        __       HZKnight free PHP Scripts    _    vs 5.1
                                       / _| __ _ _ __   /\ /\___  _   _ _ __ | |_ ___ _ __
                                      | |_ / _` | '_ \ / //_/ _ \| | | | '_ \| __/ _ \ '__|
                                      |  _| (_| | | | / __ \ (_) | |_| | | | | ||  __/ |
                                      |_|  \__,_|_| |_\/  \/\___/ \__,_|_| |_|\__\___|_|

                                              lucliscio <lucliscio@h0model.org>, ITALY










 INFORMAZIONI SULLO SCRIPT .............................................................. 1
 REQUISITI PER IL FUNZIONAMENTO ......................................................... 2
 FILE INCLUSI NELLA DISTRIBUZIONE ....................................................... 3
 INSTALLAZIONE DI UN CONTATORE .......................................................... 4
 CONFIGURAZIONE DI UN CONTATORE ......................................................... 5
 INSERIMENTO DI UN CONTATORE IN UNA PAGINA WEB .......................................... 6
 VISUALIZZAZIONE DELLE STATISTICHE ...................................................... 7
 CREDITI E CONTATTI ..................................................................... 8

 IMPOSTAZIONI AVANZATE ................................................................. A1
 DETTAGLI TECNICI ...................................................................... A2
 NORMALIZZAZIONE DI UN URL ............................................................. A3










 INFORMAZIONI SULLO SCRIPT                                                               1
 ------------------------------------------------------------------------------------------
 fanKounter � uno script in PHP gratuito, per creare e gestire una quantit� indefinita di
 contatori (grafici, testuali o invisibili) di accessi alle pagine WEB.

 E' indicato per un uso personale (mono-utenza), nel senso che � possibile programmare
 nuovi contatori solo configurandoli manualmente e non attraverso un processo guidato via
 WEB e lo stesso discorso vale per amministrarli. La creazione di una nuova istanza di
 contatore pu� avvenire anche in modo automatico, non appena se ne faccia richiesta da una
 pagina WEB ritenuta lecita.

 E' possibile monitorare gli accessi per qualunque tipo di pagina (HTML, PHP, etc) ed in
 qualunque locazione del WEB esse sono poste, anche esterne al dominio in cui � installato
 lo script. Per richiamare il contatore da una pagina WEB, � sufficiente includere un
 piccolo file di codice JavaScript auto-generato dal fanKounter.

 Ogni istanza di contatore che si crea, funziona in modo indipendente dalle altre. Lo
 script � molto flessibile, altamente personalizzabile e facile da configurare. Si pu�
 programmare la modalit� con cui i reports devono essere acquisiti, definire i tempi di una
 visita, escludere IP e maschere di IP, convalidare gli accessi.

 Ogni contatore tiene traccia dei visitatori e fornisce completi report statistici, tra cui
 referrer di provenienza, compresi i motori di ricerca e le parole chiave usate per trovare
 il nostro sito.

 Lo script non necessita di database, ma memorizza i dati in file, in maniera efficace ed
 occupando poco spazio fisico.










 REQUISITI PER IL FUNZIONAMENTO                                                          2
 ------------------------------------------------------------------------------------------
 Lo script non dovrebbe aver bisogno di requisiti HW/SW specifici, anche se i test sono
 stati effettuati su un numero limitato di sistemi.

 * Sistema Operativo: qualunque
 * Server HTTP: qualunque
 * PHP: versione 4.2.0 o successiva
 * libreria GD (opzionale): versione 2.0 o successiva










 FILE INCLUSI NELLA DISTRIBUZIONE                                                        3
 ------------------------------------------------------------------------------------------
 Decomprimendo l'archivio 'fkounter.zip', verr� ricostruita la seguente struttura di file:

 [fkounter5]                   (cartella radice)

 + [conf]                      (cartella contenente i file di configurazione)
   - conf_example.php          (esempio di configurazione per un contatore)

 + [docs]                      (cartella contenente la documentazione)
   - faqs.txt                  (domande e risposte comuni)
   - history.txt               (cronologia delle versioni, modalit� di aggiornamento)
   - license.txt               (licenza per utenti finali e sviluppatori)
   - manual.txt                (la guida all'installazione e alla configurazione)
   - readme.txt                (documento di riferimento iniziale)

 + [tool]                      (cartella contenente utilit� varie)
   - db4to5.php                (tool per convertire i contatori dalla versione 4 alla 5)
   - db4to5.txt                (informazioni sull'uso del tool 'db4to5')

 - cal.inc.php                 (libreria per gestire un calendario)
 - cnf.inc.php                 (configurazione globale dello script)
 - counter.js.php              (generatore di file JS per visualizzare il contatore)
 - counter.php                 (motore per la rilevazione e l'elaborazione dei dati)
 - dic.inc.php                 (informazioni sulle propriet� che pu� avere un visitatore)
 - lan.inc.php                 (file di testi generici in lingua italiana)
 - mak.inc.php                 (generatore automatico di istanze di contatore)
 - out.inc.php                 (gestore di stampa del contatore)
 - stats.css                   (foglio di stile per la pagina di statistiche)
 - stats.php                   (visualizzatore di statistiche)
 - sys.inc.php                 (funzioni generiche per la gestione di file)
 - url.inc.php                 (libreria per gestire URL, referrer e motori di ricerca)
 - ver.inc.php                 (definizioni per la compatibilit� con PHP versione 4.2.0)










 INSTALLAZIONE DI UN CONTATORE                                                           4
 ------------------------------------------------------------------------------------------
 Installare un contatore � molto semplice. Esistono, tuttavia, impostazioni avanzate che
 verranno trattate successivamente. Per ora preoccupiamoci dei concetti di base.

 * Nel caso in cui questa fosse la prima istanza di contatore, copiare sul WEB tutti i file
   direttamente inclusi nella cartella radice della distribuzione, rigorosamente nella
   stessa directory WEB (ad es. in 'fkounter5/').

 * Madiante un qualsiasi editor di testi, aprire il file 'conf_example.php', che si trova
   nella cartella 'conf/'.

 * Modificare in base alle proprie preferenze le sue impostazioni, descritte in dettaglio
   nel paragrafo 5 (CONFIGURAZIONE DI UN CONTATORE). Queste, tuttavia, sono gi� configurate
   correttamente e possono essere raffinate in un secondo momento.

 * Salvare il file 'conf_example.php' (sempre nella cartella 'conf/') con un altro nome
   della forma 'config_ID.php', dove ID sar� il suo identificatore.

   Un ID pu� essere costituito solamente da caratteri alfanumerici, pu� avere qualsiasi
   lunghezza, ed � case-sensitive, ossia "test" e "TesT" identificheranno normalmente due
   diverse istanze di contatore, ma questo dipende dal sistema operativo in uso.

   Se, ad esempio, si decide di identificare questo contatore con "test1", allora salvare
   il file con il nome 'conf_test1.php' (senza apici).

 * Copiare nel WEB, in una cartella chiamata 'conf/' e posta nella cartella radice dello
   script, il file 'conf_test1.php' appena creato (ad es. 'fkounter5/conf/conf_test1.php').

 Il contatore � stato creato. Per vederlo in anteprima, navigare con il browser lo scirpt
 'counter.php' come segue: 'http://...etcetc.../fkounter5/counter.php?id=test1'.










 CONFIGURAZIONE DI UN CONTATORE                                                          5
 ------------------------------------------------------------------------------------------
 Le seguenti variabili sono proprie di ogni istanza di contatore e vanno impostate nei
 rispettivi file di configurazione (ad es. 'fkounter5/conf/conf_test1.php' per il contatore
 identificato con "test1").


 $cnf__userpass (STRINGA)
 ==============
 Memorizza la password per proteggere le statistiche. Tuttavia, per ragioni di sicurezza,
 non dev'essere inserita in chiaro, ma come risultato della funzione "md5".

 Per semplicit�, se la password scelta � "admin", possiamo scriverla come segue:

  $cnf__userpass = md5("admin");

 Per attivarla nella visualizzazione delle statistiche, fare riferimento alla variabile
 '$cnf__passwd_protect'.


 $cnf__start_count (INTERO)
 =================
 Numero iniziale di conteggio, valido solo in fase di installazione. Normalmente 0.


 $cnf__mtime_unique_accs (INTERO)
 =======================
 Definisce un tempo di visita. E' un intervallo di tempo, espresso in minuti, dentro il
 quale un visitatore viene ignorato se visualizza una stessa pagina WEB pi� di una volta.
 Normalmente 30.

 Se non si vogliono distinguere visitatori da visite, impostare questa variabile a 0.

 Il valore di questa variabile pu� essere influenzato da '$cnf__expire_on_midnight'.
 Il significato di questa variabile pu� essere modificato da '$cnf__count_per_pages'.


 $cnf__expire_on_midnight (BOOLEANO)
 ========================
 Se questa variabile � impostata a TRUE, il tempo di visita scadr� improrogabilmente alla
 mezzanotte *solo* se in base alla variabile '$cnf__mtime_unique_accs' si sarebbe protratta
 nel giorno successivo. Normalmente FALSE.


 $cnf__count_per_pages (BOOLEANO)
 =====================
 Definisce il comportamento del contatore qualora una stessa istanza sia inserita in pi�
 pagine del sito.

 Se questa variabile � impostata a TRUE, per ogni visitatore, solo l'accesso alla prima
 pagina far� incrementare il contatore e le altre pagine visitate saranno ignorate per
 l'intero intervallo di tempo definito in '$cnf__mtime_unique_accs'.

 Al contrario, se questa variabile � impostata a FALSE, il contatore incrementer� di una
 unit� per ogni pagina WEB visitata nell'intervallo di tempo '$cnf__mtime_unique_accs'.

 Normalmente FALSE.


 $cnf__licit_domains_list (SEQUENZA DI STRINGHE)
 ========================
 Validatore di chiamata. Pu� memorizzare la sequenza di URLs (paths assoluti e pagine) che
 contengono l'istanza di contatore. Se il contatore viene caricato da una locazione che non
 trova riscontro in questa sequenza, non verr� incrementato.

 Per disabilitare questa funzione, lasciare la sequenza vuota, ma � sconsigliato.

 Esempio
 ..........................................................................................

  $cnf__licit_domains_list = array(
   "http://www.miosito.it/path1",
   "http://www.altrosito.it/path1/pagina.html"
  );

  * la locazione "http://www.miosito.it/path1/MiaPagina.html"             � lecita
  * la locazione "http://www.miosito.it/path2/MiaPagina.html"         NON � lecita
  * la locazione "http://www.miosito.it/path1/path2/MiaPagina.html"       � lecita
  * la locazione "http://www.altrosito.it/path1/pagina.html"              � lecita
  * la locazione "http://www.altrosito.it/path1/pagina2.html"         NON � lecita

  NOTA: il contatore verr� incrementato solo se inserito in una locazione *lecita*.
 ..........................................................................................

 Esempio
 ..........................................................................................

  // tre locazioni equivalenti, ma espresse in tre modi diversi

  $cnf__licit_domains_list = array(
   "http://www.profitterol.altervista.org/fankounter",
   "http://profitterol.altervista.org/fankounter",
   "http://207.44.208.11/fankounter"
  );
 ..........................................................................................

 Ogni URL verr� normalizzato per il confronto, come da paragrafo A3 (NORMALIZZAZIONE DI UN
 URL).


 $cnf__IPmasks_ignore_list (SEQUENZA DI STRINGHE)
 =========================
 Validatore di chiamata. Pu� memorizzare una sequenza di IPs e maschere da escludere. Se il
 contatore � invocato per conto di un IP che trova un qualche riscontro in questo array,
 non verr� incrementato.

 Nelle maschere � possibile utilizzare i due caratteri jolly:
 *   rappresenta un numero compreso tra 0 e 255;
 ?   vale (sempre e solo) una cifra da 0 a 9.

 Esempio
 ..........................................................................................

  $cnf__IPmasks_ignore_list = array( "191.91.*.*" , "192.92.126.1??" );

  * Banna tutti gli IP che iniziano con 191.91
  * Banna 192.92.126.118 ma NON banna 192.92.126.11
 ..........................................................................................

 Per disabilitare questa funzione, lasciare l'array vuoto.


 $cnf__htime_sync_server (INTERO)
 =======================
 Regola l'ora del server rispetto al tempo locale, aggiungendo o sottraendo ore.

 Se, ad esempio, l'ora del server � avanti 2 ore, assegnare alla variabile il valore -2;
 se l'ora del server � indietro di 1 ora, assegnare alla variabile il valore +1.


 $cnf__last_entries (INTERO)
 ==================
 Numero degli ultimi accessi da tenere in memoria. Normalmente 15.


 $cnf__passwd_protect (BOOLEANO)
 ====================
 Se uguale a TRUE, i dati statistici saranno visualizzabili solo previa identificazione
 tramite la password inserita in '$cnf__userpass'.


 $cnf__limit_view (INTERO)
 ================
 Imposta il limite massimo di righe per le tabelle con un elevato numero di entrate. Verr�
 poi aggiunta un'ultima riga riepilogativa il cui valore sar� la somma delle righe escluse
 nella stampa. Normalmente 15.

 Questa variabile ha effetto solamente nella fase di stampa delle statistiche.










 INSERIMENTO DI UN CONTATORE IN UNA PAGINA WEB                                           6
 ------------------------------------------------------------------------------------------
 Per monitorare gli accessi ad una pagina WEB, che sia posta in qualsiasi locazione in rete
 e che sia scritta in qualsiasi linguaggio (HTML, PHP, etc), � sufficiente includere, da
 qualche parte nella stessa, il codice JavaScript auto-generato da 'counter.js.php'.

 I parametri per lo script 'counter.js.php' sono 2:

  * id     obbligatorio, uguale all'identificatore dell'istanza di contatore da usare;
  * mode   opzionale, uguale a "graphic" (default), "text" (testo) o "hidden" (nascosto).

 Esempi
 ..........................................................................................

  <!-- Il seguente esempio visualizza il contatore "test1" in modalit� grafica -->
  <script 
  type="text/javascript" language="javascript" 
  src="fkounter5/counter.js.php?id=test1"></script>


  <!-- Il seguente esempio visualizza il contatore "test1" in modalit� testo -->
  <script 
  type="text/javascript" language="javascript" 
  src="fkounter5/counter.js.php?id=test1&mode=text"></script>


  <!-- Il seguente esempio nasconde nella pagina il contatore "test1" -->
  <script 
  type="text/javascript" language="javascript" 
  src="fkounter5/counter.js.php?id=test1&mode=hidden"></script>
 ..........................................................................................










 VISUALIZZAZIONE DELLE STATISTICHE                                                       7
 ------------------------------------------------------------------------------------------
 Lo script 'stats.php', incluso nella distribuzione, provvede alla visualizzazione delle
 statistiche raccolte per un contatore, avvalendosi anche di semplici grafici. Da questo
 modulo potranno leggersi interessanti report statistici di vario genere.

 Per accedere alle statistiche di un contatore basta navigare al seguente indirizzo:

  http://...../fkounter5/stats.php?id=test1

 dove a "test1", parametro opzionale, va sostituito l'identificatore del contatore.










 CREDITI E CONTATTI                                                                      8
 ------------------------------------------------------------------------------------------
 Il fanKounter è stato ideato e programmato da *fanatiko*. 
 Oggi il suo sviluppo è affidato a *lucliscio* che puoi contattare 
 all'indirizzo email: <lucliscio@h0model.org>.
 Il sito ufficiale del fanKounter è: https://fankounter.hzknignt.org

 RISORSE
 * https://www.php.net ................................ homepage ufficiale del progetto PHP
 * https://libgd.github.io ............................ homepage delle librerie grafiche GD
 * https://www.php.net/manual/en/book.image ........... Uso delle librerie grafiche GD con PHP 
 * https://browscap.org ............................... 'browscap.ini', per il riconoscimento di browser ed OS
 * https://github.com/bestiejs/platform.js ............ homepage ufficiale di Platform.js per il riconoscimento di browser ed OS 

 SPECIAL THANX TO...
 * Tutti coloro che hanno segnalato problemi e malfunzionamenti o hanno dato suggerimenti.










 IMPOSTAZIONI AVANZATE                                                                  A1
 ------------------------------------------------------------------------------------------
 In questo paragrafo sono trattati argomenti che riguardano la configurazione avanzata del
 fanKounter e argomenti per approfondire alcune caratteristiche dello script.


 Creazione automatica dei contatori
 ==================================
 In alternativa all'installazione manuale di ogni singolo contatore, � possibile attivare
 un meccanismo automatico di istanziamenti. In altre parole, ogni qualvolta occorra
 servirsi di un nuovo contatore, non dovremo far altro che includerlo nella nostra pagina
 WEB, come descritto nel paragrafo 6 (INSERIMENTO DI UN CONTATORE IN UNA PAGINA WEB), senza
 preoccuparci di creare un file di configurazione per esso: questo lavoro lo far� per noi
 il fanKounter.

 Per attivare questa funzionalit� occorre aprire con un editor di testi il file di nome
 'cnf.inc.php' ed impostare:

 * la configurazione default per un contatore in base alle proprie preferenze, sulla quale
   si baser� la configurazione di ogni nuovo contatore creato;

 * la costante 'MAKE_PATHS', che deve contenere un elenco di paths assoluti, separati da
   una virgola, da cui autorizzare richieste di istanziamenti di nuovi contatori.

 Esempio
 ..........................................................................................

  define( "MAKE_PATHS" , "http://www.miosito.it,http://www.altrosito.it/path1" );

  * una richiesta da "http://www.miosito.it/MiaPagina.html"               � lecita
  * una richiesta da "http://www.miosito.it/path/MiaPagina.html"          � lecita
  * una richiesta da "http://www.altrosito.it/MiaPagina.html"         NON � lecita
  * una richiesta da "http://www.altrosito.it/path1/MiaPagina.html"       � lecita
  * una richiesta da "http://www.altrosito.it/path2/MiaPagina.html"   NON � lecita

  NOTA: solo per le richieste ritenute *lecite* verr� istanziato un nuovo contatore.
 ..........................................................................................

 Ogni URL verr� normalizzato per il confronto, come da paragrafo A3 (NORMALIZZAZIONE DI UN
 URL).


 Programmazione della rilevazione dei reports
 ============================================
 Il fanKounter � molto flessibile dal punto di vista della programmazione della rilevazione
 dei reports.

 Le variabili, proprie di ciascun contatore, che permettono di configurare questo aspetto
 sono le tre seguenti:

 * $cnf__mtime_unique_accs  : INTEGER
 * $cnf__expire_on_midnight : BOOLEAN
 * $cnf__count_per_pages    : BOOLEAN

 Si rimanda al paragrafo 5 (CONFIGURAZIONE DI UN CONTATORE) per il loro significato.

 Quando si inserisce un'istanza di contatore su pi� pagine WEB, i reports saranno globali,
 ma comunque sar� possibile leggere il numero degli accessi totali che ha avuto ognuna. In
 questa ipotesi, supposto che una stessa istanza di contatore sia presente su ogni pagina
 del nostro sito, impostando la variabile '$cnf__count_per_pages' al valore TRUE potremo
 conoscere quali sono le pagine di *accesso* al sito pi� accreditate e nel frattempo
 rilevare gli accessi per visitatore (del sito, vale a dire di almeno una pagina del sito,
 quella di entrata).

 Esempio
 ..........................................................................................

  // se questa istanza di contatore � presente in tutte le pagine del nostro sito
  // rileva una sola visita per ogni visitatore del sito nell'arco di mezz'ora
  // e sapremo quali sono le pagine di accesso al sito pi� accreditate

  $cnf__mtime_unique_accs  = 30;
  $cnf__expire_on_midnight = FALSE;
  $cnf__count_per_pages    = TRUE;
 ..........................................................................................

 Solitamente � consigliabile inserire un'istanza di contatore diversa per ogni pagina WEB,
 cos� da ottenere reports statistici mirati. Il lavoro � reso estremamente semplice dalla
 funzione di auto-istanziamento, trattato nel paragrafo precedente. In questa ipotesi, la
 variabile '$cnf__count_per_pages' non ha pi� senso.

 Esempi
 ..........................................................................................

  // rileva una sola visita per ogni visitatore nell'arco di un'ora
  $cnf__mtime_unique_accs  = 60;
  $cnf__expire_on_midnight = FALSE;
  $cnf__count_per_pages    = FALSE;

  // rileva i visitatori al giorno
  $cnf__mtime_unique_accs  = 1440;   // 24 * 60 mins
  $cnf__expire_on_midnight = TRUE;
  $cnf__count_per_pages    = FALSE;

  // rileva tutte le visite senza distinguere tra visitatori e visite
  $cnf__mtime_unique_accs  = 0;
  $cnf__expire_on_midnight = FALSE;
  $cnf__count_per_pages    = FALSE;
 ..........................................................................................

 Si consiglia di non modificare, col tempo, il metodo di rilevazione per un contatore dopo
 l'installazione, cos� che le statistiche possano essere sempre coerenti.


 Convalidare le chiamate al contatore
 ====================================
 Questa funzione, attivabile dalla variabile '$cnf__licit_domains_list' a livello di ogni
 singolo contatore, permette di riconoscere chiamate lecite da chiamate falsate.

 Prima di decidere se o no attivarla, � bene valutare i pro e i contro.

 * Pro. Non permette, ad esempio, che qualcuno sistemi impropriamente un nostro contatore
   sul suo sito. Le chiamate al contatore da altre locazioni non lo farebbero incrementare.

 * Contro. Alcuni browser, come ad esempio Opera, danno la possibilit� di disabilitare il
   referrer logging. In base a questa impostazione, un visitatore che accede al nostro sito
   non verrebbe rilevato.


 Impostare una password
 ======================
 Per ragioni di sicurezza, la password in un file di configurazione non va inserita in
 chiaro, ma come risultato della funzione "md5".

 Cos�, la password va memorizzata nel modo seguente:
  $cnf__userpass = "21232f297a57a5a743894a0e4a801fc3";

 perch� ovviamente risulta che:
  md5("admin") = 21232f297a57a5a743894a0e4a801fc3

 Per impostare una nuova password, sia questa "lucertola", basta creare ed eseguire un
 semplice script in PHP contenente la seguente riga:

  <?php echo md5("lucertola"); ?>

 Il risultato che si otterr� andr� sostituito al valore di '$cnf__userpass'.


 Eliminazione automatica di dati obsoleti
 ========================================
 Il fanKounter elimina periodicamente dal database alcuni dati obsoleti e con pochi hits,
 quali chiavi di ricerca, referrer che forse non esistono pi� o non linkano pi� il nostro
 sito, etc. Tuttavia, i punti di questi non vengono perduti, ma vengono sommati in una
 apposita voce riepilogativa. Cos� facendo, periodicamente si sfoltisce il database.

 Le variabili che programmano questo aspetto, inserite nel file 'cnf.inc.php', sono le
 seguenti:

  * define( "CUTTIME" , 60*60*24*180 );   // funzione attivata ogni 6 mesi
  * define( "CUTSIZE" , 150 );            // limita le strutture dati alle prime 150 voci


 Supporto alla multiutenza
 =========================
 Il fanKounter attualmente non prevede la modalit� multiutente e tutti i contatori creati
 appartengono all'utente che li amministra.

 Tuttavia, sono state previste alcune variabili proprie di ogni istanza di contatore che
 possono tornar utili se si volesse sviluppare il fanKounter per un utilizzo simile.

 * $cnf__username = "admin";
 * $cnf__usermail = "user@email.com";
 * $cnf__userpass = md5("admin");

 Allo stato attuale, solo la variabile '$cnf__userpass' viene utilizzata dal fanKounter per
 limitare l'accesso alle statistiche di un contatore.










 DETTAGLI TECNICI                                                                       A2
 ------------------------------------------------------------------------------------------
 Il fanKounter memorizza i dati statistici di un contatore in un file ben strutturato e
 conforme a PHP. I vantaggi principali che ne conseguono sono due: un file di dati non
 tende a crescere in termini di dimensioni col tempo, ma resta pressoch� costante; per
 acquisire i dati non occorrono cicli di lettura e rielaborazioni, ma basta un'inclusione
 nello stile PHP.

 La creazione di un file di dati in formato PHP � immune da errori, grazie a degli
 accorgimenti adottati che vengono riassunti nel seguente algoritmo:

  - inizio esecuzione -
  1 se esiste un backup del database,
    sostituiscilo al database originale // exit() in caso di errore
    e cancellalo
  2 carica il database nello script
  3 aggiorna i dati statistici sulla base dei precedenti dati
  4 effettua un backup del database // exit() in caso di errore
  5 crea un database aggiornato e sostituiscilo al precedente // exit() in caso di errore
  6 ricarica il database nello script // exit() in caso di errore
  7 cancella il backup del database
  - fine esecuzione -

 Lo script � provvisto di una libreria di funzioni sui file che garantiscono che le
 operazioni di copia, cancellazione, etc o si compiano (sicuramente) correttamente o
 provochino l'interruzione immediata dell'esecuzione dell'intero script. In questo modo,
 l'algoritmo precedente diventa sicuro.

 Altra caratteristica importante del fanKounter � l'auto controllo che tiene sulla crescita
 delle strutture dati che col tempo possono eccedere in numero di elementi. Si pensi, ad
 esempio, ai referrer: un sito molto popolare pu� essere linkato da centinaia di altri
 siti. Pu� capitare, tuttavia, che alcuni di questi abbiano successivamente rimosso il link
 ed i loro hits non abbiano pi� modo di crescere col tempo, sprofondando tra le ultime
 posizioni *in eterno*. Cos�, periodicamente il fanKounter rimuove i dati con queste
 caratteristiche e riassume i loro hits in una voce riepilogativa creata per lo scopo.










 NORMALIZZAZIONE DI UN URL                                                              A3
 ------------------------------------------------------------------------------------------
 Ogni URL viene normalizzato ad una forma canonica, eliminando inoltre l'informazione
 ritenuta non utile. Cos�, due URL apparentemente differenti vengono riconosciuti uguali,
 mediante confronto stringa a stringa, quando questi rappresentino lo stesso indirizzo WEB.

 Nelle variabili di configurazione di un contatore � consigliabile inserire URL in forma
 normalizzata, ma non � obbligatorio. Non tralasciare comunque mai il protocollo "http://".

 Volendo formalizzare, un generico indirizzo WEB rispetta questa sintassi:

  URL      ::= http://DOMAIN[PORT][PATH][FILE[PARAMS]]
  DOMAIN   ::= ((www.|(Alias.)*)DomainName.Extension|IpAddress)
  PORT     ::= :PortNumber
  PATH     ::= (/PathName)*
  FILE     ::= /FileName.Extension
  PARAMS   ::= ?ParamName=Value(&ParamName=Value)*

 dove

  [ELEM]          � un elemento opzionale;
  (Elem1|Elem2)   vale "Elem1" oppure "Elem2";
  (Elem)*         � nullo oppure vale "Elem" ripetuto una o pi� volte.

 La normalizzazione di un URL si basa, fondamentalmente, su questi passi:
 * i caratteri maiuscoli di DOMAIN vengono ridotti in minuscolo;
 * se DOMAIN � sia privo di "www." che di un Alias, viene prefissato con "www.";
 * PORT, quando presente, viene eliminato se PortNumber � uguale a "80";
 * tutta la parte PARAMS viene cancellata;
 * FILE viene cancellato se FileName � uguale ad "index";
 * se un PathName � nullo o uguale a ".", "/PathName" viene cancellato;
 * se un PathName � uguale a "..", "/PathName" e "/PathName" genitore vengono cancellati.

 Esempi
 ..........................................................................................

  http://MioSito.it:80/Path/index.htm?id=15       equivale a...
  http://miosito.it:80/Path/index.htm?id=15       equivale a...
  http://www.miosito.it:80/Path/index.htm?id=15   equivale a...
  http://www.miosito.it/Path/index.htm?id=15      equivale a...
  http://www.miosito.it/Path/index.htm            equivale a...
  http://www.miosito.it/Path/                     equivale a...
  http://www.miosito.it/Path

  http://www.AltroSito.com/Path/../Pagina.htm?param=ciao   equivale a...
  http://www.altrosito.com/Path/../Pagina.htm?param=ciao   equivale a...
  http://www.altrosito.com/Path/../Pagina.htm              equivale a...
  http://www.altrosito.com/Pagina.htm
 ..........................................................................................

 Quando si inserisce un URL nelle variabili di configirazione, quali 'MAKE_PATHS' e
 '$cnf__licit_domains_list', � sufficiente inserire solo una delle forme equivalenti,
 possibilmente quella normalizzata.

 Esempio
 ..........................................................................................

  // cinque espressioni equivalenti, di cui tutte tranne la prima sono superflue

  $cnf__licit_domains_list = array(
   "http://www.miosito.it/news",                   // questa � ok
   "http://miosito.it/news",                       // questa � superflua
   "http://www.miosito.it/news/",                  // questa � superflua
   "http://www.miosito.it/news/index.php",         // questa � superflua
   "http://www.miosito.it/news/index.php?page=1"   // questa � superflua
  );
 ..........................................................................................

 C'� da notare che alcuni siti caricano tutte le pagine avvalendosi di un unico modulo
 speciale che fa le veci di loader, utilizzando un parametro di pagina. In questi casi,
 purtroppo, si perder� il riferimento alla pagina, come mostra quest'ultimo esempio di
 normalizzazione.

 Esempio
 ..........................................................................................

  http://www.ulterioresito.net/module.php?page=4    equivale a...
  http://www.ulterioresito.net/module.php
 ..........................................................................................