SELFPHP: Version 5.8.2 Befehlsreferenz - Tutorial – Kochbuch – Forum für PHP Einsteiger und professionelle Entwickler

SELFPHP


Professional CronJob-Service

Suche



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



:: Buchempfehlung ::

Fortgeschrittene CSS-Techniken

Fortgeschrittene CSS-Techniken zur Buchempfehlung
 

:: Anbieterverzeichnis ::

Globale Branchen

Informieren Sie sich über ausgewählte Unternehmen im Anbieterverzeichnis von SELFPHP  

 

:: Newsletter ::

Abonnieren Sie hier den kostenlosen SELFPHP Newsletter!

Vorname: 
Name:
E-Mail:
 
 

Zurück   PHP Forum > SELFPHP > PHP für Fortgeschrittene und Experten

PHP für Fortgeschrittene und Experten Fortgeschrittene und Experten können hier über ihre Probleme und Bedenken talken

Antwort
 
Themen-Optionen Ansicht
  #1  
Alt 05.01.2004, 12:38:25
c4 c4 ist offline
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(0100);

// 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_onlinetime());
    }

    
// 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 ­c­4­ (05.01.2004 um 12:43:47 Uhr)
Mit Zitat antworten
  #2  
Alt 05.01.2004, 12:55:48
Benutzerbild von Wichu
Wichu Wichu ist offline
Junior Member
 
Registriert seit: Oct 2003
Ort: Oberbözberg
Beiträge: 163
Wichu eine Nachricht über ICQ schicken
also ich seh jetzt auf den ersten Blick nichts falsches, aber was passiert denn wenn das Script "spinnt"??
__________________
cya
Wichu
Mit Zitat antworten
  #3  
Alt 05.01.2004, 13:28:09
c4 c4 ist offline
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....
Mit Zitat antworten
  #4  
Alt 05.01.2004, 16:04:53
c4 c4 ist offline
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(00); 
            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 ­c­4­ (05.01.2004 um 16:30:16 Uhr)
Mit Zitat antworten
Antwort


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
 
Themen-Optionen
Ansicht

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.

BB-Code ist an.
Smileys sind aus.
[IMG] Code ist aus.
HTML-Code ist aus.

Gehe zu


Alle Zeitangaben in WEZ +2. Es ist jetzt 22:16:24 Uhr.


Powered by vBulletin® Version 3.8.3 (Deutsch)
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.


© 2001-2024 E-Mail SELFPHP OHG, info@selfphp.deImpressumKontakt