Gå til innhold

Logg slettes automatisk - PHP i flatfil


Anbefalte innlegg

Hallo, har problemer med siden vår her http://www.fredrikstad-cup.no og våres logging.

 

Bruker loggføring med sidevisninger samt unike visninger pr 60 minutt med kaker. Problemet er at hver tredje, fjerde dag så resetter hele seg automatisk til enten 0, eller noen andre ganger faktisk helt virkårlig tall.

 

Koden jeg har skrevet er;

 

<?php 

// BESØKSSTATISTIKK AV HOAXED BASE FOR FREDRIKSTAD CUP

$side = $_GET['s'];
$ufil = "/home/2/f/fredrikstad-cup/www/08/logg/stats/unike.txt";
$tfil = "/home/2/f/fredrikstad-cup/www/08/logg/stats/total.txt";
$cookie = $_COOKIE['FC_VISNINGER'];

// TELLER ANTALL BESØKENDE PÅ FORSIDEN

if(!($cookie == "1")) {

list($utreff) = file($ufil); 
$usfil = fopen($ufil, 'w'); 
fwrite($usfil, $utreff + 1); 
fclose($usfil); 	

setcookie("FC_VISNINGER","1", time()+60*60, "/");


} 

// TELLER ANTALL SIDEVISNINGER	

list($ttreff) = file($tfil); 
$tsfil = fopen($tfil, 'w'); 
fwrite($tsfil, $ttreff + 1); 
fclose($tsfil); 	



?>

 

Hvordan kan jeg ungå dette? SQL?, vil det da gå tregere hvis jeg skal åpne databasen, skrive til to tabeller, og så lukke den istedet for å skrive til to filer?

Endret av HoaXed
Lenke til kommentar
Videoannonse
Annonse
Uten at jeg har noen som helst mulighet til å sjekke det så antar jeg nesten det her kommer av flere samtidige redigeringer, altså fila blir ikke låst for «exclusive» redigering. Løsningen på problemet er flock(...).

Bruker jeg denne funksjonen og to stk da redigerer samtidig. Vil loggtelleren da bare telle en stk, og ikke to?

 

Takk for tipset forresten :)

Lenke til kommentar

Bruk mysql og endre cookies til session

 

lite eksempel

 

$q = "
SELECT COUNT(ip) 
FROM counter 
WHERE ip='{$ip_adresse}'
AND DATE_FORMAT(besoksdato, '%d/%m/%Y') = DATE_FORMAT(NOW(), '%d/%m/%Y')
";
$e = mysql_query($q);
$r = mysql_fetch_assoc($e);

if($r['COUNT(ip)'] == 1) {
 $query = "UPDATE counter SET besoksdato=date("Y-m-d h:i:s"), hits=hits+1 WHERE ip='".$ip_adresse."'";
} else {
 $query = "INSERT INTO counter (ip,besoksdato,hits) VALUES ('".$ip_adresse."', date("Y-m-d h:i:s"), 1)";
}

@mysql_query($query) or die ("stats failed!");

 

Dersom jeg ikke har glemt så mye sql, så skal denne sjekke brukere for dagen, dersom en bruker er logget oppdatererer scriptet raden..

Lenke til kommentar
Uten at jeg har noen som helst mulighet til å sjekke det så antar jeg nesten det her kommer av flere samtidige redigeringer, altså fila blir ikke låst for «exclusive» redigering. Løsningen på problemet er flock(...).

Bruker jeg denne funksjonen og to stk da redigerer samtidig. Vil loggtelleren da bare telle en stk, og ikke to?

 

Takk for tipset forresten :)

Det var det da. Her burde manualen pressisert hva den gjør. Det er nemlig to muligheter. Enten venter flock til den kan få en lock på fila, eller så returnerer den false. Man skulle tro at flock gir false hvis den ikke får lock (for å forhindre deadlock), men flock vil faktisk vente til den får lock. Mao. den vil telle som normal siden det til enhver tid bare er en som redigerer fila. Alle andre vil vente til fila er ledig for så å skrive.

Lenke til kommentar
Uten at jeg har noen som helst mulighet til å sjekke det så antar jeg nesten det her kommer av flere samtidige redigeringer, altså fila blir ikke låst for «exclusive» redigering. Løsningen på problemet er flock(...).

Bruker jeg denne funksjonen og to stk da redigerer samtidig. Vil loggtelleren da bare telle en stk, og ikke to?

 

Takk for tipset forresten :)

Det var det da. Her burde manualen pressisert hva den gjør. Det er nemlig to muligheter. Enten venter flock til den kan få en lock på fila, eller så returnerer den false. Man skulle tro at flock gir false hvis den ikke får lock (for å forhindre deadlock), men flock vil faktisk vente til den får lock. Mao. den vil telle som normal siden det til enhver tid bare er en som redigerer fila. Alle andre vil vente til fila er ledig for så å skrive.

Takk. Er ikke altfor god i engelsk til å lese meg til det der.

 

Men prøver. Problemet er at det er vanskelig å teste ut :) Dette bør vell ikke forårsake til så mye ekstra ventetid på lastinga? Er sql alikevell raskere?

Lenke til kommentar
Uten at jeg har noen som helst mulighet til å sjekke det så antar jeg nesten det her kommer av flere samtidige redigeringer, altså fila blir ikke låst for «exclusive» redigering. Løsningen på problemet er flock(...).

Bruker jeg denne funksjonen og to stk da redigerer samtidig. Vil loggtelleren da bare telle en stk, og ikke to?

 

Takk for tipset forresten :)

Det var det da. Her burde manualen pressisert hva den gjør. Det er nemlig to muligheter. Enten venter flock til den kan få en lock på fila, eller så returnerer den false. Man skulle tro at flock gir false hvis den ikke får lock (for å forhindre deadlock), men flock vil faktisk vente til den får lock. Mao. den vil telle som normal siden det til enhver tid bare er en som redigerer fila. Alle andre vil vente til fila er ledig for så å skrive.

Takk. Er ikke altfor god i engelsk til å lese meg til det der.

 

Men prøver. Problemet er at det er vanskelig å teste ut :) Dette bør vell ikke forårsake til så mye ekstra ventetid på lastinga? Er sql alikevell raskere?

Nope, dette er et samtidighetsproblem alle får så lenge flere skal skrive til samme fil samtidig. Mao. å bruke en database vil ikke medføre noen umiddelbart bedre ytelse. Til simple ting er rett og slett databaser «overkill», og tilbyr garantert dårligere ytelse.

Endret av Ernie
Lenke til kommentar

Da har jeg oppdatert koden med følgende:

 

<?php 

// BESØKSSTATISTIKK AV HOAXED BASE FOR FREDRIKSTAD CUP

$side = $_GET['s'];
$ufil = "/home/2/f/fredrikstad-cup/www/08/logg/stats/unike.txt";
$tfil = "/home/2/f/fredrikstad-cup/www/08/logg/stats/total.txt";
$cookie = $_COOKIE['FC_VISNINGER'];

// TELLER ANTALL BESØKENDE PÅ FORSIDEN

if(!($cookie == "1")) {

list($utreff) = file($ufil); 
$usfil = fopen($ufil, 'w'); 

if (flock($usfil, LOCK_EX)) {

	fwrite($usfil, $utreff + 1); 

   flock($usfil, LOCK_UN); 

}

fclose($usfil); 
setcookie("FC_VISNINGER","1", time()+60*60, "/");

} 

// TELLER ANTALL SIDEVISNINGER	

list($ttreff) = file($tfil); 
$tsfil = fopen($tfil, 'w'); 

if (flock($tsfil, LOCK_EX)) { 

	fwrite($tsfil, $ttreff + 1); 

flock($tsfil, LOCK_UN); 

}
fclose($tsfil);


?>

Lurer dog på om jeg har valgt riktig LOCK_X?

 

Og har egentlig laste tiden blitt dårligere tro. www.fredrikstad-cup.no .. TRor ikke det. Glimrende! :)

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...