Gå til innhold

[Løst]Telle brukere online uten database


Anbefalte innlegg

Videoannonse
Annonse

JS er vell det som har blitt brukt en del. Ellers så kan du bruke en flat fil og gi hver besøkende en id (som lagres i session og i flat film med tid) også telle alle id'ne som har vært aktive de siste x minuttene.

 

Dette er tatt direkte uparsa og tenkt over fra min lille hjerne

Lenke til kommentar

Her er måten du kan gjøre det på med flatfil (online.txt)

 

<?php 
$log_file="online.txt";
$min_online="1";
if ($HTTP_X_FORWARDED_FOR == "") {
$ip = getenv(REMOTE_ADDR);
}
else {
$ip = getenv(HTTP_X_FORWARDED_FOR);
}
$day =date("d");
$month =date("m");
$year =date("Y");
$date="$day-$month-$year";
$ora = date("H");
$minuti = date("i");
$secondi = date("s");
$time="$ora:$minuti:$secondi";
$users_read = fopen("$log_file", "r");
$users = fread($users_read, filesize("$log_file"));
fclose($users_read);
$to_write="$ip|$time|$date";
if($users==0){
$user_write = fopen("$log_file", "w");
fputs($user_write , $to_write );
fclose($user_write );
}
else{
$users=explode("\n",$users);
$user_da_tenere=array();
while (list ($key, $val) = each ($users)) {
$user_sing=explode("|",$val);
if($date==$user_sing[2]){
$h=explode(":",$user_sing[1]);
if($ip!=$user_sing[0]){
if(($h[0]==$ora)and(($minuti-$h[1])<=$min_online)){
$user_da_tenere[]=$val;}
if(($h[0]==($ora-1))and((($minuti+2)-$h[1])<=$min_online)){
$user_da_tenere[]=$val;
}
}
}
}
$user_da_tenere[]=$to_write;
$user_write = fopen("$log_file", "w");
fputs($user_write , "" );
fclose($user_write );
while (list ($k, $v) = each ($user_da_tenere)) {
$new_file_log = fopen ("$log_file", "a");
fwrite($new_file_log,"$v\n");
fclose($new_file_log);
}
}
$users_online_read = fopen("$log_file", "r");
$users_online = fread($users_online_read, filesize("$log_file"));
fclose($users_online_read);
$users_online=explode("\n",$users_online);
$n_u_online=count($users_online)-1;

?>

 

Beklager uryddig kode, men dette skal funke :)

Lenke til kommentar

Jeg har en wtf til koden din

$day =date("d");
$month =date("m");
$year =date("Y");
$date="$day-$month-$year";
$ora = date("H");
$minuti = date("i");
$secondi = date("s");
$time="$ora:$minuti:$secondi";

ehm, blir det ikke enklere og MYE mer ryddigere og gjøre det slik?

$date = date("d-m-Y");
$time = date("H:i:s");

 

 

Btw skal finne en bedre, hvis ikke jeg koder en som er litt enklere enn Yankes sin :)

 

EDIT:

 <?php
session_start();

function getUsersOnline() {
$count = 0;

$handle = opendir(session_save_path());
if ($handle == false) return -1;

while (($file = readdir($handle)) != false) {
if (ereg("^sess", $file)) $count++;
}
closedir($handle);

return $count;
}

echo getUsersOnline();  
?>

Fant en, men funker tho bare på Linux / Apache

Endret av Famen
Lenke til kommentar

Siden jeg kom med en ide lenger opp så kan jeg jo utføre den også.

 

Fikk litt tid nå før jeg skal ut, så tenkte dette kunne være til hjelp.

Dette er testen med 2 brukere online, de er aktive i 5 minutter før de slettes fra flatfilen.

$uniqe finnes for å hindre å ødelegge sessions i andre script på servern.

 

Og som du ser så har ikke jeg brukt ip siden det kan være flere brukere på samme ip (fra en skole eller arbeidsplass feks)

Dette scriptet skal også funke på alle plattformer

<?php
session_start();
$uniqe = 'count';
$aktiv = $_SESSION[$uniqe]['aktiv'];
if(empty($aktiv)) {
$id = rand(0, 99999999999);
} else {
$id = $aktiv;
}
$file = file('count.txt');

foreach($file as $key => $entry) {
$entry = str_replace("\n",'',$entry);
$explode = explode('|',$entry);
if($explode[1] > (time() - 300)) {
	$users[$key] = $explode[0];
	if($explode[0] == $id) {
		$is_logged = true;
		$acc_time[$key] = time();
	} else {
		$acc_time[$key] = $explode[1];
	}
}
}
if(!$is_logged) {
$key++;
$acc_time[$key] = time();
$users[$key] = $id;

}
if(is_array($users)) {
foreach($users as $key => $user) {
	if(empty($line)) {
		$line = $user.'|'.$acc_time[$key];
	} else {
		$line .= "\n".$user.'|'.$acc_time[$key];
	}
}
}
$fp = fopen('count.txt','w');
fwrite($fp,$line);
fclose($fp);
$_SESSION[$uniqe]['aktiv'] = $id;


function antall() {
$file = file('count.txt');
return count($file);
}
echo antall();

Lenke til kommentar

Takk allesammen.

Prøvde AlecTBM's kode, og den virka fint. :)

 

Edit: fikk error når jeg brukte den i include.

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /home/sacredwa/public_html/php/chat/index.php:38) in /home/sacredwa/public_html/php/chat/countusers.php on line 2
Endret av kake_fisk
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å
×
×
  • Opprett ny...