[PHP] hitcounter hoogt per 2 op, wat ik ook doe

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • jwbagger
  • Registratie: Februari 2001
  • Laatst online: 21-07 21:03

jwbagger

,.-~'`'~-.,

Topicstarter
Ik heb een simpel scriptje gemaakt dat een counter in een apart bestand bijhoudt, een heel simpele pageview meter dus.

Dit scriptje heb ik al een tijdje gebruikt op verschillende pagina's, en het werkt foutloos. Het enige dat moet gebeuren is een getal inlezen, dit ophogen, vervolgens wegschrijven, en returnen. Weinig aan fout te doen, lijkt me zo.

Hier het oorspronkelijke script:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?
function counter(){
    $file = fopen("counter.txt","r+");
    if (!$file){
         $counter= "counter_error";
    }     
    if ($counter!="counter_error"){
        $counter = fread ($file, 30);
        fseek($file,0);
        fwrite($file, ++$counter, 30);
        fclose($file);
    }
    return $counter;
}
?>

Dit werkt uitstekend, dus valt er weinig te klagen.

Nu heb ik op een nieuwe pagina die ik heb gemaakt, weer dit stukje script geinclude. Op zich werkt het goed, alleen heb ik het probleem dat de counter iedere keer met twee opgehoogd is. Ik snap er niets van, omdat exact hetzelfde script het op andere pagina's wél goed doet.

Om te debuggen heb ik het volgende script gemaakt, een beetje een aanpassing van het bovenstaande, maar functioneel hetzelfde:

code:
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
<?
function counter(){
    $file = fopen("counter.txt","r+");
    if (!$file){
         $counter= "counter_error";
    }
    if ($counter!="counter_error"){
        //inlezen teller
        $counter = fgets ($file);
        echo "R: ".$counter." ";

        //reset bestand
        fseek($file,0);

        //ophogen teller
        $counter++;

        //wegschrijven teller
        fwrite($file, $counter);
        fclose($file);
    }
    print "/ W: ".($counter);
    return $counter;
}
?>


Wat blijkt per pageview, een overzicht van de stand van de teller gedurende het laden:
-- eerst de inhoud counter.txt: 1
-- nu inladen pagina, runnen script
-- waarde R: 1
-- waarde W: 2
-- inhoud counter.txt: 3 << what the hell?

Het probleem is dus niet dat er "per ongeluk" het counterscript tweemaal aangeroepen wordt, want anders zou ik die R en W nog ergens in de output terug moeten vinden. (bovendien alle code doorzocht en niets gevonden dat hierop wees).
Na het ophogen en wegschrijven van de counter blijkt het bestand dus een keer teveel verhoogd te zijn, wat het "hoogt per 2 op" verklaart. Maar waar dit nou vandaan komt, is me werkelijk een raadsel.

Wanneer ik als test de regel counter++ uitcomment, wordt W gelijk aan R (uiteraard), maar schrijft hij opeens ook gewoon W in counter.txt. Dan wordt de counter dus opeens helemaal niet meer opgehoogd, en bij een enkele verhoging wordt het dubbel opgehoogd weggeschreven...

Ik snap er niets van dat het op de ene pagina wél werkt, en op de andere niet... en ik kan nérgens vinden waar dit wazige probleem aan zou kunnen liggen...

Een directe oplossing zal er waarschijnlijk niet gegeven kunnen worden op dit topic, aangezien de code waarschijnlijk geen fouten bevat. Daarom is mijn vraag eerder in de trant van: waar zou ik nu nog kunnen zoeken naar een fout, die waarschijnlijk ergens anders in m'n code, of in m'n serverconfiguratie zit..?

[ Voor 12% gewijzigd door jwbagger op 29-03-2005 01:09 ]


Acties:
  • 0 Henk 'm!

  • DiLDoG
  • Registratie: Oktober 2002
  • Laatst online: 18-09 08:45
hmmm... raar
gebruik je ergens (i)frames ofzo?
en check anders de source eens, misschien dat ie je debug nog ergens weergeeft op plaatsen die je browser niet renderd (comments, buiten body tag?)

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Vlak voor de include die je op je pagina hebt zet je een nieuwe variabele op een leuke waarde. Indien bijv. $foo='bar' laat je dan je counterscript meteen returnen. Na je include zet je de variabele ergens anders op. Op die manier wordt je counter alleen opgehoogd door 'de andere mysterieuze aanroep'.

Als je niet alle geprinte teksten denkt te zien, kan je die ook gewoon naar een file schrijven. ;)

Leef je uit. :P

[ Voor 5% gewijzigd door Voutloos op 29-03-2005 01:21 ]

{signature}


Acties:
  • 0 Henk 'm!

  • jwbagger
  • Registratie: Februari 2001
  • Laatst online: 21-07 21:03

jwbagger

,.-~'`'~-.,

Topicstarter
@DiLDoG : ik gebruik geen frames/iframes/whatever, alles is gewoon in tabellen. In de source van de pagina kan ik nergens anders output van het counterscriptje vinden, de enige output staat helemaal aan het begin van de file, dus nog voor de html tag, omdat ik de rest pas later laat renderen via een template. Als het script twee keer uitgevoerd zou zijn, zou ik dit dus ook zéker wel moeten kunnen vinden.

@Voutloos : ik snap niet helemaal wat je bedoelt met het eerst setten van een variabele, wat dat voor nut heeft eigenlijk... Het uitcommenten van de ene regel waar ik zeker weet dat het script aangeroepen wordt, levert in ieder geval een niet-ophogende counter op. Zo weet ik wel dat er niet een andere "mysterieuze" aanroep zou moeten zijn volgens mij...

Acties:
  • 0 Henk 'm!

  • Jrz
  • Registratie: Mei 2000
  • Laatst online: 23:54

Jrz

––––––––––––

Misschien wordt er eerst een HEAD gevragd, en daarna een GET

Ennnnnnnnnn laat losssssssss.... https://github.com/jrz/container-shell (instant container met chroot op current directory)


Acties:
  • 0 Henk 'm!

  • Brakkie
  • Registratie: Maart 2001
  • Niet online

Brakkie

blaat

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
function counter(){
    $file = fopen("counter.txt","r+");
    if (!$file){
         $counter= "counter_error";
    }
    if ($counter!="counter_error"){
        //inlezen teller
        $counter = fgets ($file);
        echo "R: ".$counter." ";
        
        if($counter != "")
        {
            //reset bestand
            fseek($file,0);
        }
        else
        {
            $counter = 0;
        }
        //ophogen teller
        $counter++;

        //wegschrijven teller
        fwrite($file, $counter);
        fclose($file);
    }
    print "/ W: ".($counter);
    return $counter;
}
counter();


Dit werkt prima bij mij. Hij hoogt zo gewoon netjes met 1 op. Als ie dat bij jou niet doet moet je de fout niet in deze functie zoeken.

Systeem | Strava


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
jwbagger schreef op dinsdag 29 maart 2005 @ 14:43:
@Voutloos : ik snap niet helemaal wat je bedoelt met het eerst setten van een variabele, wat dat voor nut heeft eigenlijk... Het uitcommenten van de ene regel waar ik zeker weet dat het script aangeroepen wordt, levert in ieder geval een niet-ophogende counter op. Zo weet ik wel dat er niet een andere "mysterieuze" aanroep zou moeten zijn volgens mij...
Ik dacht da je alleen de counter++ in commentaar zette. In dat geval wordt counter uiteraard bij welke aanroep dan ook niet opgehoogd. ;) Blijkbaar verkeerd begrepen.

[ Voor 4% gewijzigd door Voutloos op 29-03-2005 14:56 ]

{signature}


Acties:
  • 0 Henk 'm!

  • jwbagger
  • Registratie: Februari 2001
  • Laatst online: 21-07 21:03

jwbagger

,.-~'`'~-.,

Topicstarter
Voutloos schreef op dinsdag 29 maart 2005 @ 14:56:
[...]
Ik dacht da je alleen de counter++ in commentaar zette. In dat geval wordt counter uiteraard bij welke aanroep dan ook niet opgehoogd. ;) Blijkbaar verkeerd begrepen.
nee, niet verkeerd begrepen hoor :) ik had in eerste instantie inderdaad alleen counter++ uitgecomment, omdat die namelijk WEL het juiste resultaat aan de return meegeeft, maar in het bestand 1 te hoog staad. Dus verdacht ik het wegschrijven van een fout ergens, waardoor ik wilde kijken wat hij deed als ik 'm gewoon niet op zou hogen...

ik had zojuist dus geprobeerd om die ene aanroep van het script dus weg te halen, en controleren of hij dan nog werd aangeroepen. Dit bleek dus ook niet het geval te zijn, vreemd genoeg...

Acties:
  • 0 Henk 'm!

  • jwbagger
  • Registratie: Februari 2001
  • Laatst online: 21-07 21:03

jwbagger

,.-~'`'~-.,

Topicstarter
Ik heb wat gevonden, door het script aan te passen en per keer dat de counter wordt gebruikt, in een bestand neer te zetten door welke request_uri dit is gedaan. Dit leverde een redelijk logisch antwoord op:

code:
1
2
192 - /
193 - /favicon.ico

Kortom, de counter wordt tweemaal opgehoogd doordat het volledige script gewoon twee keer wordt gerund. Dit is door de /favicon.ico request, die ook naar het script geforward wordt, blijkbaar.

Ik laat apache namelijk dmv een .htaccess file de url rewriten zodat het script zijn input op dezelfde wijze krijgt zoals GoT ook bijvoorbeeld werkt. (dus zonder ? en & er in)

code:
1
2
3
4
5
RewriteEngine On
RewriteBase /
RewriteRule index.php.* - [L]
RewriteCond %{REQUEST_URI} !^(.*)?(/img/)+(.*)+
RewriteRule ([^/]*)/?([^/]*)/?(.*) /index.php?a=$1&b=$2&c=$3


Ik zou hier de regel RewriteCond %{REQUEST_URI} !/favicon.ico aan toe kunnen voegen, maar is dit voldoende? Zijn er nog andere (soortgelijke) requests die door browsers of andere zaken gegenereerd kunnen worden, die ik ook af zou moeten vangen?
Pagina: 1