Jag behöver hjälp med ett problem som jag har haft på min hemsida under
flera månader. Jag vill ha en simpel räknare på min hemsida som bara
visar antalet besökare i text.
Jag har en sådan just nu (kolla https://www.titanicnorden.com) men denna har
ett problem. 2-3 gånger i månaden börjar den om från 0. Jag har letat
runt på Internet, men hittar inte någon liknande räknare. Den behöver
inte ha några funktioner utan bara visa antalet besökare i ren text.
Den jag har nu heter counter.cgi och gör en data.dat fil som sparar
antalet besökare.
Kolla med ditt webhotell vad de har för "städpolicy". En del har automatiska rutiner för att plocka bort vissa filtyper. Prova att döpa om räknaren till data.htm eller data.html.
Du använder inte möjligtvis Matt Wrights räknare? Har själv haft, och har hört talas om flera som haft problem med den. Skriptet låser inte datafilen vid skrivning, vilket gör att den är sårbar för "race conditions".
Jag skrev om det skript jag körde så att datafilen låstes, och då upphörde problemet.
Tack för svaren.
Jag kör räknaren som finns på https://www.erimax.com
Provar just nu en räknare som går igenom en annan hemsida, men den verkar missa många besökare. Usch va svårt det ska vara att hitta en räknare som funkar :)
Felet är att data.dat blir korrupt med jämna mellanrum. Jag skrev till erimax och frågade och de svarade att de hade samma fel. Felet ska ligga i scriptet och de bad mig rätta det själv, men jag kan inget om script.
Vill försöka få denna räknaren att funka eftersom det är den enda jag har fått att fungera på min hemsida.
Det jag vid en snabb titt kan konstatera är att de inte låser datafilen när de läser in data.
...
open(FILE, $data_file) or die("Kunde inte öppna filen: $!");
@indata = <FILE>;
close(FILE) or die("Kunde inte stänga filen: $!");
open(FILE, ">$data_file") or die("Kunde inte öppna filen: $!");
flock(FILE, LOCK_EX) or die("Kunde inte låsa filen: $!");
...
Vad som teoretiskt kan hända här är:
* Process 1 läser öppnar datafilen för läsning, läser in filen till @indata, och stänger filen. Sedan öppnar samma process filen för skrivning och låser den.
* Samtidigt som process 1 håller på med att skriva till data filen så öppnar process 2 filen för läsning (detta är möjligt eftersom man inte använder flock när man läser filen), och läser in filen till @indata. Problemet är att filen nu kan vara ofullständig, beroende på hur långt process 1 har hunnit att skriva.
* Process 2 försöker öppna filen för skrivning, men sätts i kö tills process 1 har skrivit klart.
* När process 1 har skrivit klart och låst upp filen så öppnar process 2 filen för skrivning och låser den. Sedan försöker process 2 skriva saker till filen baserat på vad som finns i @indata. Men @indata kan som sagt vara ofullständig och detta gör att data filen blir korrupt när process 2 skrivit till den.
Lösningen på detta problem är att låsa filen även vid läsning (man har gjort det längre ner i ett annat sammanhang med flock(FILE, LOCK_SH) men har tydligen missat att göra det här.
Finns även snyggare metoder att lösa det på. Går att läsa om här:
Erimax sa att jag själv skulle lösa problemet, men jag kan
ingenting om cgiscript. Jag hade blivit dig väldigt tacksam ifall du kände rätta till felet i scriptet så det går att använda på min hemsida.