Jullie gaan er vanuit dat TS sessions wil/kan gebruiken.
Wat als dit niet zo is? Een oplossing is de volgende;
Initialiseren
PHP:
1
2
3
4
| // init
$dir = $_SERVER['DOCUMENT_ROOT'].'/map/bla/bla/';
$fname = 'counter.inc';
$x_period = "1 SEC"; // <- whatever you want, see php's strtotime() |
Maak een opslagbestand aan of open de reeds bestaande
PHP:
1
2
3
4
| // init (create?) counter file
if(!$fp = fopen($dir.$fname, "a+")) {
$error = true;
} |
Vervolgens ga je kijken of er al data (een
line) van de bezoeker in het bestand voorkomt.
False) Als dit niet zo is, dan is het simpel: je maakt een nieuwe lijn aan met informatie over de gebruiker.
Je slaat de volgende data op: het ip-adres, het aantal visits (1) en de huidige tijd. Dit alles #-gescheiden + een new line character, bijv.
196.12.24.101#1#1137604676\r\n
True) De bezoeker bestaat al in je bestand, dus ga je kijken of de bezoeker de pagina bezocht heeft binnen de tijd die jij er voor gezet hebt (zie variabele `x_period`). Als dat wél zo is, doe je niets, als dat níet zo is dan moet het aantal visits van de bezoeker verhoogt worden met één. Dit doe je door de gehele lijn van de bezoeker te vervangen door exact dezelfde lijn, echter met het aantal visits verhoogd met één. Ofwel:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
| if(!isset($error)) {
$content = file_get_contents($dir.$fname);
// collect visitor data
$ip = $_SERVER['REMOTE_ADDR'];
$curtime = time();
$regexp = "/".$ip."#[0-9]+#[0-9]{10}/";
// current visitor (=ip) already exists in file?
$exists = preg_match($regexp, $content, $matches) == 1 ? true : false;
// increase counter?
switch($exists) {
case false:
// create new line for this new visitor
fwrite($fp, $ip."#1#".$curtime."\r\n");
break;
case true:
// check or this visitor
// visited this page within the
// x-period of time. If not,
// increase visitors ammount.
$data = explode("#", $matches[0]);
if($data[2] < strtotime("-".$x_period)) {
$data[1]++;
$data[2] = $curtime;
$newline = implode("#", $data);
$upd_fp = fopen($dir.$fname, "w");
fwrite($upd_fp, preg_replace($regexp, $newline, $content));
fclose($upd_fp);
}
break;
}
fclose($fp);
} |
Vervolgens maak je nog een hyper-mega-superknots functie die voor je gaat tellen hoeveel hits er geweest zijn (en hits wil in dit geval zeggen, het aantal bezoekjes aan je pagina zonder dat een gebruiker die binnen de tijd `x_period` terugkwam meegerekend wordt). Zie hier:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
| // function to collect visitor ammounts
// (vars `dir` and `fname` must be defined)
function hits() {
global $dir, $fname;
if($file = file($dir.$fname)) {
preg_match_all(
"/[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+#([0-9]+)#[0-9]{10}/",
file_get_contents($dir.$fname),
$matches
);
return array_sum($matches[1]);
}
} |
Het kan allemaal efficienter qua coding, maar het is een werkend voorbeeld..
[
Voor 5% gewijzigd door
Verwijderd op 18-01-2006 18:25
]