Moin,
so schön mein neuer Besucherzähler auch ist, so unlogisch ist das Problem: Irgendwann wird aus noch ungeklärter Ursache die Statistik gelöscht und alles geht von vorn los.
Das Skript:
PHP-Code:
<?php
// Funktion mit $counter=user_counter() aufrufen.
// Nach Ablauf des Skriptes stehen dann folgende Variablen zur Verfuegung:
// $counter['hits_today'] Hits am heutigen Tag
// $counter['hits_yesterday'] Hits vom Vortag
// $counter['visits_today'] Besucher am heutigen Tag
// $counter['visits_yesterday'] Besucher vom Vortag
// $counter['hits_total'] Gesamthits
// $counter['visits_total'] Gesamtbesucherzahl
// $counter['user_online'] Zahl der User, die online sind
// $counter['max_online'][0] Maximale Zahl gleichzeitiger Besucher
// $counter['max_online'][1] ...zu diesem Zeitpunkt. Fuer Formatierung siehe [url]http://php.net/date[/url]
function user_counter() {
// Pfad zur Datei, in der alles gespeichert werden soll
$datafile='./counter_db.php';
// Zeit in Sekunden, die ein Besucher als online gelten soll
$time_user_online=300;
// Zeit in Sekunden, die ein Besucher nicht als neuer Besucher gezaehlt werden soll
$time_visits=1800;
// Zeitstempel speichern
$timestamp=date('Ymd');
$timestamp_yesterday=date('Ymd', time()-86400);
// Falls 'Datenbank' noch nicht existiert, dann mit Standardwerten erstellen
// -->> Nach erstem Durchlauf auskommentieren! <<--
// /* vor if und
// */ hinter } (geschweifte Klammer)
if (!file_exists($datafile)) {
$fh=fopen($datafile, 'w');
$content='';
$content.="<?phpn";
$content.="$ips[]=array(0, 0, 0);n";
$content.="$counter['hits_total']=0;n";
$content.="$counter['visits_total']=0;n";
$content.="$counter['max_online']=array(0, 0);n";
$content.="?>";
fwrite($fh, $content);
fclose($fh);
}
// Diese Datei einbinden
include($datafile);
// Hits erhoehen - heutige und gesamt
if (!isset($hits[$timestamp])) {
$hits[$timestamp]=1;
}
else {
$hits[$timestamp]++;
}
$counter['hits_total']++;
// Visits setzen, wenn nicht vorhanden
if (!isset($visits[$timestamp])) {
$visits[$timestamp]=0;
}
// Zaehler fuer aktive Nutzer auf Seite
$user_online=0;
// IPs aussortieren und aktualisieren
$found_ip_v=$found_ip_o=0;
for ($i=0; $i<count($ips); $i++) {
// Alte IPs entfernen
// v - Visits, o - Online
if ($ips[$i][2]=='v' && time()-$time_visits>$ips[$i][1]) {
$ips[$i]=0;
continue;
}
elseif ($ips[$i][2]=='o' && time()-$time_user_online>$ips[$i][1]) {
$ips[$i]=0;
continue;
}
// Zeiten der aktuellen IP neu setzen
if ($ips[$i][0]==$_SERVER['REMOTE_ADDR'] && $ips[$i][2]=='v') {
$ips[$i][1]=time();
$found_ip_v=1;
}
// Zeiten der aktuellen IP neu setzen
elseif ($ips[$i][0]==$_SERVER['REMOTE_ADDR'] && $ips[$i][2]=='o') {
$ips[$i][1]=time();
$found_ip_o=1;
}
if ($ips[$i][2]=='o') {
// Zaehler fuer aktive Nutzer auf Seite erhoehen
$user_online++;
}
}
// IP hinzufuegen, wenn noch nicht in Liste
if ($found_ip_v==0) {
// Visits erhoehen
$visits[$timestamp]++;
$counter['visits_total']++;
// Zaehler fuer aktive Nutzer auf Seite erhoehen
$user_online++;
// IP hinzufuegen
$ips[]=array($_SERVER['REMOTE_ADDR'], time(), 'v');
$ips[]=array($_SERVER['REMOTE_ADDR'], time(), 'o');
}
elseif ($found_ip_o==0) {
// Zaehler fuer aktive Nutzer auf Seite erhoehen
$user_online++;
// IP hinzufuegen
$ips[]=array($_SERVER['REMOTE_ADDR'], time(), 'o');
}
if ($user_online>$counter['max_online'][0]) {
$counter['max_online']=array($user_online, time());
}
// Daten fuer neue 'Datenbank' sammeln
$content='';
$content.="<?phpn";
foreach ($hits as $k => $v) {
$content.="$hits['$k'] = $v;n";
}
foreach ($visits as $k => $v) {
$content.="$visits['$k'] = $v;n";
}
$content.="$counter['hits_today'] = {$hits[$timestamp]};n";
$content.="$counter['hits_yesterday'] = ".(isset($hits[$timestamp_yesterday]) ? $hits[$timestamp_yesterday] : 0).";n";
$content.="$counter['visits_today'] = {$visits[$timestamp]};n";
$content.="$counter['visits_yesterday'] = ".(isset($visits[$timestamp_yesterday]) ? $visits[$timestamp_yesterday] : 0).";n";
$content.="$counter['hits_total'] = {$counter['hits_total']};n";
$content.="$counter['visits_total'] = {$counter['visits_total']};n";
$content.="$counter['user_online'] = $user_online;n";
$content.="$counter['max_online'] = array({$counter['max_online'][0]}, {$counter['max_online'][1]});n";
foreach ($ips as $k => $v) {
if ($v!=0) {
$content.="$ips[] = array('$v[0]', $v[1], '$v[2]');n";
}
}
$content.="?>";
// 'Datenbank' speichern
$fh=fopen($datafile, 'w');
if (flock($fh, LOCK_EX)) {
fwrite($fh, $content);
flock($fh, LOCK_UN);
}
fclose($fh);
// Datei erneut einbinden, damit aktualisierte Werte uebergeben werden koennen
include($datafile);
return $counter;
}
?>
Auch zu finden unter
http://dbCF.de/t-besucherzaehler/
Das Problem trat gestern nicht zum ersten Mal auf. Aber zum ersten Mal mit der Nutzung von flock() Vorher ist es auch schon ohne passiert.
Ich lasse mir jetzt immer eine Mail schicken, wenn die Gesamtzahl aller Besucher kleiner fünf ist. In der Hoffnung, dass ich rausfinde, bei welcher Seite das passiert ist. Bisher hat mir der Inhalt noch nicht geholfen.
Wie gesagt: Ich weiß nicht warum es passiert.
Könnte es an der Zahl (bis zu 20) gleichzeitiger Zugriffe liegen? Aber PHP sorgt doch eigentlich dafür, dass dann alles der Reihe nach abläuft, nicht oder?
Externe Variablen dürften auch kein Problem sein, ist es doch schließlich eine Funktion, die sich nur um ihr eigenes Zeug kümmert.
Hinweis: An dem
PHP-Code:
if (!file_exists($datafile))
wie im Skript zu sehen, liegt es nicht, das ist bei mir auskommentiert.
Ich weiß, dass das Skript auch von anderen genutzt wird - dafür ist es ja da. Ich habe allerdings noch keine Beschwerden zu dem Thema erhalten. Entweder sind die bloß zu faul oder es liegt an meinen anderen Skripten.
So, das war's erst einmal, was mir so einfällt. Würde mich freuen, wenn ihr mir helfen könnt.
Bye
Carsten