unika besök-räknare

Avdelningen för webbrelaterad programmering och grafisk design.
Post Reply
User avatar
MadModder
Posts: 3297
Joined: 2002-03-20 19:43:10
Location: Madland
Contact:

unika besök-räknare

Post by MadModder »

Tyckte att den räknaren jag hade tog fasligt lång tid på sig att räkna igenom IP-nummrena. Över 2 sekunder för 1000 IP-nummer. Den läser in hela filen i en array å jämför å håller på med preg_replace 2 gånger å massa skit... "Varför då?" undrade jag.
Såg ut såhär:

Code: Select all

<?
$ipnummer=getenv("REMOTE_ADDR");
$count = 0;
$array[$count++] = $ipnummer;
$handle = fopen("hits2.txt", "r");
while (!feof ($handle)) {
	$buffer = fgets($handle, 4096);
	if (preg_replace("/\r?\n$|\r[^\n]$/", "", trim($buffer)) != "") {
		$array[$count++] = preg_replace("/\r?\n$|\r[^\n]$/", "", trim($buffer));
	}
}
fclose ($handle);

$new = array(); 
for($i=0;$i<count($array);++$i) { 
	if(in_array($array[$i], $new) != "true") { 
		$new[] = $array[$i];
	}
}

$handle = fopen("hits2.txt", "w");
for ($i = 0; $i < sizeof($new); $i++) {
	fputs($handle, $new[$i]."\n");
}
fclose($handle);

echo sizeof($new);
?>
Men så onödigt krångligt tänkte jag och skrev en egen, utan nån array alls, såhär:

Code: Select all

<?
$ipnummer=getenv("REMOTE_ADDR");
$ip=trim($ipnummer);
$count=0;
$flag=0;
$handle=fopen("hits2.txt", "r");
while (!feof ($handle)) {
	$buffer=trim(fgets($handle,4096));
	$count++;
	if ($ip==$buffer) {
		$flag=1;
	}
}
fclose($handle);
if ($flag==0) {
	$handle=fopen("hits2.txt","a");
	fputs($handle,$ipnummer."\n");
	fclose($handle);
	$count++;
}
echo ($count-1);
?>
Det tar så kort tid så jag kan inte mäta manuellt. Måste erkänna att jag är lite stolt faktiskt. ;D Har inte hållt på med PHP så värst länge.
Nån som vill optimera ytterligare är välkommen. Det är fullt möjligt att min metod inte är den bästa :)
User avatar
thr
Posts: 1242
Joined: 2002-06-26 22:55:24
Location: Skene
Contact:

Post by thr »

Code: Select all

<?php
$fo = fopen("antal.txt","r");
while($source = fgets($fo,4096)){
	$current = $source;
}
fclose($fo);
$fo = fopen("antal.txt","w")
fputs($fo,$current+1);
fclose($fo);
echo $current+1
?>
Kräver:
filen antal.txt med siffran 0 i från början, i samma map som filen där scriptet ovan ligger.

EDIT: ah, unika besökare :> jaja :)

Då blir det:

Code: Select all

<?php
$fo_unika = fopen("unika.txt","r");
$current = fgets("unika.txt",4096);
fclose($fo_unika);

$fo_ip = fopen("ip.txt","a");
$str_buff = fgets($fo_ip,4096);
fclose($fo_ip);
$arr_buff = explode("|",$str_buff);

if(!in_array($_SERVER['REMOTE_ADDR'],$arr_buff)){
$fo_unika = fopen("unika.txt","w");
fputs($fo_unika,$current+1);
fclose($fo_unika);
$fo_ip = fopen("ip.txt","a");
fputs($fo_ip,"|" . $_SERVER['REMOTE_ADDR']);
fclose($fo_ip);
}
echo $current+1;
Har säkert missat något, men men.
User avatar
MadModder
Posts: 3297
Joined: 2002-03-20 19:43:10
Location: Madland
Contact:

Post by MadModder »

Ok. Ja, ser ju bra ut... men jag orkar inte göra om filformatet :)
User avatar
nva
Hedersbit
Posts: 2517
Joined: 2002-03-07 23:34:21
Location: Skåneland
Contact:

Post by nva »

Du kan ju alltid lägga till ett "break;" sist i if-satsen på rad 10 så att den avbryter while-satsen om den hittar en match, även om det kanske inte gör så mycket om det redan går så fort att du inte lyckas mäta det. :)
The three most dangerous things in the world are a programmer with a soldering iron, a hardware type with a program patch and a user with an idea.

In theory, there is no difference between theory and practice. But, in practice, there is.
User avatar
MadModder
Posts: 3297
Joined: 2002-03-20 19:43:10
Location: Madland
Contact:

Post by MadModder »

nva wrote:Du kan ju alltid lägga till ett "break;" sist i if-satsen på rad 10 så att den avbryter while-satsen om den hittar en match, även om det kanske inte gör så mycket om det redan går så fort att du inte lyckas mäta det. :)
Visst visst, men då har den ju inte räknat klart antalet besökare :P
User avatar
nva
Hedersbit
Posts: 2517
Joined: 2002-03-07 23:34:21
Location: Skåneland
Contact:

Post by nva »

MadModder wrote:
nva wrote:Du kan ju alltid lägga till ett "break;" sist i if-satsen på rad 10 så att den avbryter while-satsen om den hittar en match, även om det kanske inte gör så mycket om det redan går så fort att du inte lyckas mäta det. :)
Visst visst, men då har den ju inte räknat klart antalet besökare :P
Aha, jag var lite för snabb där. :P
The three most dangerous things in the world are a programmer with a soldering iron, a hardware type with a program patch and a user with an idea.

In theory, there is no difference between theory and practice. But, in practice, there is.
Post Reply