Essì, ho sempre schernito chi lo faceva, ed adesso sono costretto ad usare anch'io un contatore di visite basato su file anzichè su db.
L'argomento è ben più difficile di quanto un neofita possa pensare: la gestione corretta della concorrenza con una simile tecnologia è difatti IMPOSSIBILE. Posto questo, come vi pare il seguente codice?
Codice PHP:
<?php
// Semplice funzione di conteggio basata su file (quindi senza gestione corretta della concorrenza).
// [Gli @ sono aggiunti per evitare la visualizzazione degli errori in caso di permessi insufficienti per lo script: in caso di
// "Permission denied", infatti, i soli controlli sull'"if open" non sopprimono la visualizzazione dell'errore a video].
function _my_counter($counterfile)
{
$count = 0;
// Se il file esiste, lo apro in lettura e ne leggo il contenuto
if (file_exists($counterfile))
{
// Se il file esiste ma non è possibile aprirlo in lettura (perchè lockato da un processo in scrittura e/o momentaneamente protetto o bloccato
// da qualche processo in loop/crash), allora esco e non ritorno nulla: se non lo facessi ritornerei un valore fisso e sbagliato di 1 visita.
// Infine, trasformo quanto letto in intero - type casting.
if (!$fd = @fopen($counterfile,"r")) return false;
$count = (int)@fread($fd,@filesize($counterfile));
@fclose($fd);
}
// Aggiornamento numero visite (SOLO se il file non esisteva, il conteggio parte da uno)
if ($count<1) $count=1;
else $count++;
// Aggiornamento (scrittura) file
if (!$fd = @fopen($counterfile,"w+")) return false;
@fwrite($fd,$count);
@fclose($fd);
if ($count==1) return "Pagina visualizzata [b]".$count."[/b] volta.";
else if ($count>1) return "Pagina visualizzata [b]".$count."[/b] volte.";
else return false; // Per qualsiasi altro imprecisato motivo
}
// **************** main
$counterfile = "counter_file.log";
echo _my_counter($counterfile);
?>
10x a lot