Nella guida base a PHP ed in quella avanzata ho trattato le operazioni per la gestione dei file. Ricordo che PHP gestisce internamente i file come delle risorse quelle quali effettuare operazioni di lettura, scrittura od analisi. Questo però non è sempre necessario, soprattutto nel caso in cui si effettuino operazioni statistiche o operazioni di alto livello quali il recupero delle singole righe o la lettura dell'intero contenuto di un file in un solo comando.
Per presentare un esempio pratico, ho deciso di mostrare e commentare un semplice blocco di codice che vi permetterà di aggiungere un contatore di visite personalizzato alle vostre pagine. Il blocco di codice in questione sarà una classe molto semplice, che eventualmente potrete estendere al fine di cambiarne il comportamento specifico.
Cominciamo con la definizione delle classi che utilizzeremo nel nostro codice:
<?php
interface DataProvider
{
public function storeVisits($visits);
public function readVisits();
}
class FileDataProvider implements DataProvider
{
const FILE_PATH = 'counter.txt';
private $fp;
public function __construct()
{
if(!file_exists(FileDataProvider::FILE_PATH))
{
$fp = fopen(FileDataProvider::FILE_PATH, 'w+');
fwrite($fp, '0');
fclose($fp);
}
$this->fp = fopen(FileDataProvider::FILE_PATH, 'r+');
}
public function readVisits()
{
return intval(file_get_contents(FileDataProvider::FILE_PATH));
}
public function storeVisits($visits)
{
ftruncate($this->fp, 0);
fseek($this->fp, 0);
fwrite($this->fp, strval($visits));
}
public function __destruct()
{
fclose($this->fp);
}
}
class SimpleCounter
{
private $provider;
public $visits;
public function __construct(DataProvider $provider)
{
$this->provider = $provider;
$this->visits = $this->provider->readVisits();
if($this->isValid())
{
$this->provider->storeVisits(++$this->visits);
}
}
protected function isValid()
{
return true;
}
}
?>
Il codice è molto semplice:
- definisce un'interfaccia che si occupa di rappresentare la struttura base di delle classi che potranno occuparsi di recuperare e salvare informazioni sulle visite;
- implementa l'interfaccia con un sistema che salva le informazioni su disco;
- definisce una classe che, quando costruita, recupera le informazioni da un DataProvider, controlla la validità dell'utente corrente ed eventualmente incrementa le visite. IsValid è stata messa per permettere alle classi che estenderanno SimpleCounter di specificare sistemi di validazione personalizzati (come il controllo dell'IP) per creare counter più completi.
L'utilizzo della classe (che salveremo dentro lib/counter.php
) è il seguente:
<?php
require_once 'lib/counter.php';
$counter = new SimpleCounter(new FileDataProvider);
echo "Questa pagina è stata visitata ".$counter->visits." volte";
?>
Ad ogni aggiornamento della pagina verrà incrementato il numero delle visite. Prima di testare lo script è molto importante assicurarsi che la directory corrente abbia i permessi impostati correttamente, altrimenti il file non potrà essere creato o scritto.
Se volessimo impostare lo script in modo che l'aggiornamento delle visite non avvenga ad ogni reload della pagina da parte dello stesso utente ma che, una volta effettuata la prima visita, non venga aggiornato il numero per un determinato lasso di tempo, possiamo utilizzare vari sistemi. Il più semplice è sicuramente l'utilizzo di un cookie:
<?php
class CookieCounter extends SimpleCounter
{
public function __construct(DataProvider $provider)
{
parent::__construct($provider);
}
public function isValid()
{
if(!isset($_COOKIE['counter_cookie']))
{
setcookie('counter_cookie', '1', time() + 3600);
return true;
}
return false;
}
}
?>
Salviamo questo file in lib/cookiecounter.php
e modifichiamo leggermente il file index.ph
p:
<?php
require_once 'lib/counter.php';
require_once 'lib/cookiecounter.php';
$counter = new CookieCounter(new FileDataProvider);
echo "Questa pagina è stata visitata ".$counter->visits." volte";
?>
Ecco fatto: un gioco da ragazzi. Ovviamente se non avete abilitati i cookie lo script non funzionerà.