CronJob-Service
bei SELFPHP mit ...
|
+ minütlichen Aufrufen
+ eigenem Crontab Eintrag
+ unbegrenzten CronJobs
+ Statistiken
+ Beispielaufrufen
+ Control-Bereich
Führen Sie mit den CronJobs von
SELFPHP zeitgesteuert Programme
auf Ihrem Server
aus. Weitere Infos
|
:: Anbieterverzeichnis ::
Globale Branchen
Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP
:: Newsletter ::
Abonnieren Sie hier den kostenlosen
SELFPHP Newsletter!
|
PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken |
05.01.2004, 12:38:25
|
SELFPHP Guru
|
|
Registriert seit: Jul 2002
Ort: Oberursel
Alter: 54
Beiträge: 4.748
|
|
Besucherzähler macht was böses
Moin,
hab meinen Besucherzähler neu geschrieben und dabei erweitert. Irgendwo steckt auch das ungewollte Feature drin, dass das Skript manchmal spinnt. Nur weiß ich natürlich nicht wann und wo.
PHP-Code:
<font size='2' face='courier new'>
<?php
$_SERVER['REMOTE_ADDR']=rand(0, 100);
// 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=10;
// Zeit in Sekunden, die ein Besucher nicht als neuer Besucher gezaehlt werden soll
$time_visits=30;
// 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($vists[$timestamp])) {
$vists[$timestamp]=0;
}
// Zaehler fuer aktive Nutzer auf Seite
$user_online=0;
// IPs aussortieren und aktualisieren
$found_ip=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]) {
unset($ips[$i]);
continue;
}
elseif ($ips[$i][2]=='o' && time()-$time_user_online>$ips[$i][1]) {
unset($ips[$i]);
continue;
}
if ($ips[$i][2]=='o') {
// Zaehler fuer aktive Nutzer auf Seite erhoehen
$user_online++;
}
// Zeiten der aktuellen IP neu setzen
if ($ips[$i][0]==$_SERVER['REMOTE_ADDR']) {
$ips[$i][1]=time();
$found_ip=1;
}
}
if ($found_ip==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');
}
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) {
$content.="$ips[] = array('$v[0]', $v[1], '$v[2]');n";
}
$content.="?>";
// 'Datenbank' speichern
$fh=fopen($datafile, 'w');
fwrite($fh, $content);
fclose($fh);
// Datei erneut einbinden, damit aktualisierte Werte uebergeben werden koennen
include($datafile);
// Daten fuer Nutzer
foreach ($counter as $k => $v) {
echo "$k - $v<br>n";
}
echo "<hr />n";
// Hits
foreach ($hits as $k => $v) {
echo "$k - $v<br>n";
}
echo "<hr />n";
// Visits
foreach ($visits as $k => $v) {
echo "$k - $v<br>n";
}
echo "<hr />n";
// IPs
foreach ($ips as $k => $v) {
echo "$v[0] - $v[1] - $v[2]<br>n";
}
return $counter;
}
user_counter()
?>
</font>
<script>
setTimeout("document.location.href='counter.php';", 1000);
</script>
Das Skript läuft soweit richtig, nur manchmal sind irgendwelche Werte nicht gesetzt und damit ist die erstellte Datei nicht gültig (z.B. $user_online=;)
Die dargebotene Variante hat IPs von 0 bis 100, wird jede Sekunde neu geladen und gibt den Inhalt der Arrays aus. Das ist natürlich nur zu Testzwecken drin.
Momentan gilt jede 'IP' 10 Sekunden als aktiver Besucher und 30 Sekunden als ehemaliger Besucher. Also nach den Zeitangaben werden die IPs wieder dazugezählt.
Ich weiß echt nicht, was da nicht klappt. Hab es hier schon über 200 mal durchlaufen lassen und es klappt natürlich.
Danke,
Carsten
Geändert von c4 (05.01.2004 um 12:43:47 Uhr)
|
05.01.2004, 12:55:48
|
|
Junior Member
|
|
Registriert seit: Oct 2003
Ort: Oberbözberg
Beiträge: 163
|
|
also ich seh jetzt auf den ersten Blick nichts falsches, aber was passiert denn wenn das Script "spinnt"??
__________________
cya
Wichu
|
05.01.2004, 13:28:09
|
SELFPHP Guru
|
|
Registriert seit: Jul 2002
Ort: Oberursel
Alter: 54
Beiträge: 4.748
|
|
Zitat:
Original geschrieben von _c_4_
Das Skript läuft soweit richtig, nur manchmal sind irgendwelche Werte nicht gesetzt und damit ist die erstellte Datei nicht gültig (z.B. $user_online=;)
|
Das Skript läuft bereits auf meiner Website. Natürlich war ich heute nicht anwesend, als der Fehler auftrat. Also ist mir die Fehlermeldung (leider!) auch nicht bekannt.
Bei Tests konnte ich obiges beobachten, hab das Problem gelöst und eigentlich sollte es nicht mehr vorkommen.
Nachdem es auf meinem Rechner über mehrere (simulierte) Tage hin fast 1000 Visits gezählt hat und natürlich keine Fehler auftraten, lasse ich es wieder auf meiner HP laufen. Abwarten, was passiert....
|
05.01.2004, 16:04:53
|
SELFPHP Guru
|
|
Registriert seit: Jul 2002
Ort: Oberursel
Alter: 54
Beiträge: 4.748
|
|
Ein anderes, mir nicht erklärbares Problem ist, dass eine IP doppelt gespeichert wird. Beispiel:
$ips[] = array('xy.24.65.4', 1073313031, 'v');
$ips[] = array('xy.24.65.4', 1073313031, 'v');
Es gibt wirklich keinen Grund, warum diese IP 2x für die Visits gespeichert wird. Sieht irgendwie so aus, als ob unset() etwas unerwartetes macht.
Edit: Habe ich doch glaube ich den Fehler entdeckt!
Im Skript steht:
PHP-Code:
if ($ips[$i][2]=='v' && time()-$time_visits>$ips[$i][1]) {
unset($ips[$i]);
continue;
}
Das ist dumm, wird doch dadurch in der Zählschleife das folgende Feld übersprungen. Nun steht es so da und ich meine, dass das sinnvoller ist:
PHP-Code:
if ($ips[$i][2]=='v' && time()-$time_visits>$ips[$i][1]) {
$ips[$i]=array(0, 0 , 0);
continue;
}
Dazu kam noch eine Abfrage am Ende des Skriptes, damit diese unbrauchbaren Felder nicht mit gespeichert werden und schon sollte es endlich alles klappen, wie es sollte. Hoffentlich....
Geändert von c4 (05.01.2004 um 16:30:16 Uhr)
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
Alle Zeitangaben in WEZ +2. Es ist jetzt 11:04:31 Uhr.
|