- ivar
- Medlem ●
- Stockholm
Hej!
Håller på med en relativt stor site som vill ha något i stil med:
"Online just nu: 320"
Det var över ett år sedan jag kikade på onlinescript i php och undrade om någon har bra koll på den här fronten. Kanske något färdigjort script eller nya smarta funktioner som man bör använda sig av?
alla tips är välkomna!
Online just nu. Hmmm lättast är om du har inloggning på siten.
Och sedan räknar du de inloggade bara så vet du.
Vettigt är då att ha en timeout på de som är inloggade ifall de hoppar vidare till en annan sida utan att logga ut.
Sedan är det bara en fråga om var du ska lagra vilka som är inloggade. Jag skulle rekommendera en databas.
[EDIT] Squashed some bugs [/EDIT]
[ 16 Januari 2003, 08:48: Meddelandet ändrat av: Mattias Hedman ]
Har ett som gäller för användare som loggar in sig, men söker ett som fungerar såsom 99macs.
"190 medlemmar och 50 gäster online"
Fast jag tänker skriva "240 online" rakt av
Timeout är vad som använts i det script jag hittat och ändrat..
fler bra förslag
För varje besök slänger du in en ny rad i en databas, den raderas automatiskt efter typ 10 minuter.
När en besökare laddar en sida jämförs ip-numret mot db´n, hittar den en rad så uppdateras den med ytterligare 10 minuters liv (hittas den inte förs en ny rad in i db´n).
På det sättet får du en db där varje rad är en besökare. Pang bara.
Edit: Förövrigt är det ju enkelt att kolla om en besökare är "medlem" och man kan då föra in det i onlinedatabasen som "member". Då kan du även differentiera mellan medlemmar och gäster.
[ 16 Januari 2003, 13:18: Meddelandet ändrat av: Linus ]
Snygg lösning
Som alternativ till att lagra IP-adresser kan du ju använda Session-ID. Om du använder sessioner, vill säga. Fördelen skulle väl vara att du ibland har flera besökare från samma publika IP (när de sitter bakom en NAT-router). Men det kanske kvittar.
... och när du ändå använder sessions-ID så kan du naturligtvis hoppa över detabasen.
Eftersom sessions-ID lagras i /tmp är det bara att räkna antalet sessionsfiler som satts under den tid som motsvarar mellanrummet mellan nutid och (nutid - 10 minuter).
Å andra sidan — har du mycket skrivande till /tmp är det bättre att definiera att sessions-ID-filerna läggs någon annanstans (för att hålla uppe hastigheten).
Att räkna ett antal filer i en mapp/katalog torde gå våldsamt mycket fortare än att skriva till och läsa från en databas.
//Mikael
quote:Skapades ursprungligen av: Linus:
Det tar så gott som ingen tid att genomföra, men vill man jaga millisekunder så visst
Man vill alltid jaga millisekunder.
Att avläsa antalet besökare genom sessionshantering istället för databashantering går säkerligen några, kanske 10, ms snabbare per besökare. För några hundra samtidiga besökare handlar det alltså minst om tusentalet ms bara för att få fram besöksantalstalet. Den tiden, och CPU-kraften, kan användas till viktigare saker.
//Mikael
Då jag inte har någon koll på hur filhantering hanteras så tror jag att jag nöjer mig med ip till en början...
Vad jag undrar är om man kan skriva något i stil med
$query = "SELECT user_time FROM online_users WHERE user_time-now() > 1000"
Var över ett år sedan jag skrev php och minns inte om "now()" ens finns...
misve, om du har något färdigt skript liggandes över hantering av /tmps session filer och räkning av dessa etc. så får du gärna berätta mer, annars väntar jag nog och får upp en fungerandes version till en början
Gjorde inget eget, men hittade på nätet:
code:<pre style="font-size:x-small; font-family: monospace;"> <?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 "Användare online " . getUsersOnline();
?></pre>
//Mikael
Session är klart att föredra. Det var lätt under PHP 4 innan 4.2 och 4.3. Nu har det blivt lite kårngligare jag har inte blivit kompis med det ännu och jag vill inte slå på den gamal funktionen p.g.a säkerhetsrisken.
Men kör på sessions! Bäst i alla lägen.
Speciellet eftersom sessions självdör när personen lämnar sidan. Med andra ord kommer du få en bra siffra på antalet online just nu.
quote:Skapades ursprungligen av: misve:
Gjorde inget eget, men hittade på nätet:
code:<pre style="font-size:x-small; font-family: monospace;"> <?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 "Användare online " . getUsersOnline();
?></pre>
//Mikael
Blev lite förvånad, klippte in och slängde upp på servern. Stod att det var 2094 online!
Sen så refreshade jag utan att ha öppnat något fönster eller dylikt. Då var det 2096 online! sen öppnade jag ett nytt fönster för att se om siffran ökade med ett eftersom jag skulle få ett nytt sessionvärde, men icke.
den stod kvar på 2096. refreshade, refreshade, refreshade.. men inget hände, nu stod den kvar.
Stängde ett fönster för att se om den minskade med ett , men inte det heller.
Tror inte det här scriptet fungerar någe vidare när man har många domäner hos samma server?
Jag har mitt hos FS data.
quote:Skapades ursprungligen av: ivar:
Tror inte det här scriptet fungerar någe vidare när man har många domäner hos samma server?
Jag har mitt hos FS data.
Alldeles riktigt, det där scriptet räknar filerna i php´s sessions-katalog, där kommer alltså _alla_ sessions för hela webbhotellet ligga, inte bara dina
titta här för lite olika sätt att lösa det ->
http://www.hotscripts.com/PHP/Scripts_and_Programs/Counters/Real-Time/
Du får ta och fixa en lokal "sessionskatalog" och sätta tmp-behörigheter på den (alternativt skapa en egen katalog på FS-data:s /tmp).
session_save_path("/tmp/sessions");
//Mikael
quote:Skapades ursprungligen av: misve:
session_save_path("/tmp/sessions");
//Mikael
Är det relativt mot var index.php filen ligger som skriver session_save_path ??
dvs. om det ser ut något i stil med
/home/i/ivar/
så skriver jag
session_save_path("dafilez/");
Då krävs det att jag i min hem-mapp skapat katalogen dafilez ? eller kräver session_save_path("/tmp/sessions"); att springa ner bland rotkatalogerna?
/tmp/sessions/ skulle vara en katalog i webbhotellets tmp-katalog i roten. Kanske säkrare då att använda din hemkatalog:
mkdir /home/i/ivar/sessions
chmod 777 /home/i/ivar/sessions
Det senare för att ge webbservern tillträde till katalogen.
citera:Skapades ursprungligen av: HL:
mkdir /home/i/ivar/sessions
chmod 777 /home/i/ivar/sessions
Och om man inte känner till pathen till sin hemkatalog borde man kunna använda
mkdir ~/sessions
chmod 777 ~/sessions
Fast behöver webservern verkligen 777 för tillträde? Det ger ju allt och alla tillträde?
citera:Skapades ursprungligen av: scooterbabe:
Fast behöver webservern verkligen 777 för tillträde? Det ger ju allt och alla tillträde?
Sorgligt men sant. Webbservern kör ju som en egen användare, till exempel www, och när man skapar kataloger på webbservern med FTP/SSH så är det med en annan användare. För att webbservern ska kunna skriva i session-katalogen så måste man ge alla användare den möjligheten.
Man kan komma runt det genom att köra PHP-scripten som CGI med su_exec, vilket gör att de körs med din egen användare. Det är dock ingen bra lösning, för det går mycket långsammare.
Man borde ha egen server så man slapp oroa sig... :rolleyes: