amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > PHP: Webcounter mit 'Reload-Sperre'? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

01.03.2003, 17:08 Uhr

Rudi
Posts: 835
Nutzer
Hi,

ich hab für meiner Emu-HP einen simplen Webcounter in PHP erstellt.

Welche Daten (IP, Browser usw.) muß ich abfragen, daß der Counter bei
einem 'Reload' nicht hochgezäht wird.

Ich brauche jetzt kein fertiges PHP-Script, sondern möchte nur
wissen, welche Daten des 'Surfenden' ich auswerten muss,
damit der Reload erkannt wird...

Gruß... Rudi

--
Besucht die Seite, auf der Sich alles um Emulatoren auf Amiga dreht:

http://www.amilator.de/


oder schaut mal bei den Göttinger Amiga Usern rein:

http://www.g-a-u.org/


[ - Antworten - Zitieren - Direktlink - ]

02.03.2003, 13:03 Uhr

mrbbc
Posts: 101
Nutzer
Du müsstest ein Cookie (serverseitig) setzen, siehe PHP-Doku http://www.php3.net/docs.php


Was ich aber bei derartigen Dingen besonders nahe lege, ist, in den HTML-Daten das HTTP-equiv expires zu setzen, z.B. bei einem Forenskript.

Also <meta http-equiv="expires" content="60">, wenn eine Seite erst nach 1 Minute neu geladen werden soll.

Wenn du nämlich so rumspringst, dann laden einige Brauser häufig jede Datei wieder neu, mit diesem "expires" dauert das mindestens eine Minute, es sei denn, der Nutzer klickt auf Reload. Damit wird der Server entlastet.

Wenn eine Datei länger aktuell bleibt, kann man den expires auch gerne größer setzen, z.B. 600000, also zirka eine Woche.

Das fehlende expires ist auch der Grund, warum Webcounter meist nicht stimmen, nicht, weil so viele ein paarmal auf Reload klicken...

--
it obvisiously seems to have been hard to write

[ - Antworten - Zitieren - Direktlink - ]

03.03.2003, 15:34 Uhr

tokai
Posts: 1071
Nutzer
Cookies benötigst du nicht.

Du musst bei jedem Aufruf einer Seite die IP des Remote-Host und Aufrufzeitpunkt zwischenspeichern. Dann kannst du testen ob die Seite von einer bestimmten IP schonmal angefragt wurde. Natürlich musst du die zwischengespeicherten IPs nach einem Timeout (z.B.: 10min) wieder rausschmeissen.

Du wolltest ja keinen fertiges Script, ansonsten könntest du einfach diese Klasse bei dir einbinden:

counter.class
code:
<?php

/*
**  counter.class
**  Object-oriented implementation of a counter in PHP
**
**  Copyright (c) 2003  Christian Rosentreter <karibu@gmx.net>
**
**  This program is free software; you can redistribute it and/or modify
**  it under the terms of the GNU General Public License as published by
**  the Free Software Foundation; either version 2 of the License, or
**  (at your option) any later version.
**
**  This program is distributed in the hope that it will be useful, but
**  WITHOUT ANY WARRANTY; without even the implied warranty of
**  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
**  GNU General Public License for more details.
**
**  $Id: counter.class,v 1.5 2003/03/02 00:57:15 tokai Exp $
**
**  History:
**
**  1.5 2003/03/02 - changed fputs to fwrite and removed lenght parameter
**
**  1.4 2003/02/20 - small source cleanup
**                 - extended example.php with online user counter and record
**
**  1.3 2003/02/14 - online user counter added
**                 - max online user record added
**
**  1.2 2003/02/10 - fixed a few typos
**
**  1.1 2003/02/08 - source cleanup
**                 - english comments added
**                 - example.php created
**
**  1.0 2003/02/02 - first release
*/


/*
**  You can bypass an alternative name on object initialisation, e.g.
**  $counter = new Counter("path/new.name");
*/
define ("CNT_DEFAULTFILENAME","counter.dat");

/*
**  Timeout in seconds. After time's run of a new hit by the same user counts
**  as new visit.
*/
define ("CNT_TIMEOUT",600); /* 600 = 10 minutes */



class Counter
{
    var $hits     = 0;
    var $visits   = 0;
    var $user     = 0;
    var $maxuser  = 0;

    var $ip       = 0;
    var $time     = 0;

    var $iparr    = Array();


    /* ---------------------------------------------------------------------- ----
    **
    **  constructor
    **
    **  @param  string $filename  The filename of the database.
    **  @access private
    */
    function Counter($filename)
    {
        if( !($filename) )
        {
            $filename = CNT_DEFAULTFILENAME;
        }

        $this->ReadCounter($filename);
        $this->UpdateCounter();
        $this->WriteCounter($filename);
    }


    /* ---------------------------------------------------------------------- ----
    **
    **  Reads hits, visits and logged IPs from the database file.
    **
    **  @param  string $filename The name of the file.
    **  @access private
    */
    function ReadCounter($filename)
    {
        if ( $filearr = @file($filename) )
        {
            list($this->hits,$this->visits,$this->maxuser) = explode('|',rtrim($filearr[0]));
            $this->iparr = array_slice($filearr,1);
        }
    }


    /* ---------------------------------------------------------------------- ----
    **
    **  Increases hits. If the REMOTE_ADDR (ip of user) is not logged or logged
    **  REMOTE_ADDR is timed out also the visits counter will be increased. Was
    **  the IP already in database (REMOTE_ADDR is not timed out yet), so the
    **  entry for the appropriate IP will be updated to setup the timeout again.
    **
    **  @access private
    */
    function UpdateCounter()
    {
        $this->ip       = getenv("REMOTE_ADDR");
        $this->currtime = time();

        $this->hits++;

        $do  = TRUE;
        $pos = 0;

        foreach($this->iparr as $checkip)
        {
            list($lastip,$lasttime) = explode("|",rtrim($checkip));

            if ( ($this->ip == $lastip) && (($this->currtime - $lasttime) < CNT_TIMEOUT) )
            {
                $do = FALSE;
                $mpos = $pos;
            }

            $pos++;
        }

        $this->user = $pos;
        if ($this->user > $this->maxuser)
        {
            $this->maxuser = $this->user;
        }


        $entry = $this->ip."|".$this->currtime."n";
        if ($do == FALSE)
        {
            $this->iparr[$mpos] = $entry;
        }
        else
        {
            $this->visits++;
            array_push($this->iparr,$entry);
        }

    }


    /* ---------------------------------------------------------------------- ----
    **
    **  Writes back hits and visits into the file. Additionally also all logged
    **  IPs, which don't timed out yet, are back-stored at the very same file.
    **
    **  @param  string $filename The name of the file.
    **  @access private
    */
    function WriteCounter($filename)
    {
       if ( $file = @fopen($filename,"w") )
       {
           fwrite($file,$this->hits."|".$this->visits."|".$this->maxuser." n");

           foreach($this->iparr as $checkip)
           {
               list($lastip,$lasttime) = explode("|",$checkip);

               if ( ($this->currtime - $lasttime) < CNT_TIMEOUT  )
               {
                   fwrite($file,$checkip);
               }
           }

           fclose($file);
       }
    }


    /* ---------------------------------------------------------------------- ----
    **
    **  @access public
    */
    function Hits()    { return $this->hits;    }
    function Visits()  { return $this->visits;  }
    function User()    { return $this->user;    }
    function Maxuser() { return $this->maxuser; }



} /* class Counter */

?>


so könnte dann der Aufruf in deiner Seite ausschauen:

code:
<?php

    require_once 'counter.class';
    $counter  = new Counter("counter.dat");

    $pageviews            = $counter->Hits();
    $besucher             = $counter->Visits();
    $gerade_online        = $counter->User();
    $gerade_online_rekord = $counter->Maxuser();
?>

<html>
<head>
    <title>example</title>
</head>
<body>
    <?php echo $besucher; ?> Besucher haben 
    <?php echo $pageviews; ?> Seitenaufrufe verursacht. :) 
    <br><br>
    Momentan sind gerade <?php echo $gerade_online; ?> Besucher 
    auf dieser Seite online. Der Rekord lag bei
    <?php echo $gerade_online_rekord; ?>.
</body>
</html>


So könnte das ausschauen... in der Tat. Aaaaaaber du wolltest ja kein fertiges Skript... dabei wäre es so einfach einzubinden! ;)

Hoffe ich konnte trotzdem helfen! :)

--
taniquetil.de

[ Dieser Beitrag wurde von tokai am 03.03.2003 editiert. ]

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > PHP: Webcounter mit 'Reload-Sperre'? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.