webmaster resource
+ Webmaster Forum von Webmaster-Resource.de » Sonstiges » Scripte (Moderator: » тнє $υι¢ι∂є « ™)
|-+ [PHP | MYSQL] Usere Online
Username:
Password:

Seiten: [1]
Topic Tools  
Read 30. Oktober 2006, 20:59:50 #0
krafdi

[PHP | MYSQL] Usere Online

Suche ein PHP script welches mir anzeigt wie viele usere gerade online sind.

Gruß
Krafdi
« Letzte Änderung: 20. April 2007, 12:53:45 von EpiX »

Fehlender Plan wird durch Wahnsinn ersetzt!!Zunge
Offline  
Read 30. Oktober 2006, 21:19:52 #1
Daniel

Usere Online

TIP: zähle die Dateien im SESSION-Ordner, event. noch den letzten Zugriff auf die Datei feststellen und Du weißt wieviele User ON sind.
(Bedingung: alles läuft über Session's und Du hast einen separaten SESSION-Ordner falls Du norm. WebSpace hast).

Daniel


Offline  
Read 30. Oktober 2006, 23:19:27 #2
vind

Usere Online

Wo ist dieser Ordner denn Lokal (in meinem fall apache) zu finden?
Offline  
Read 31. Oktober 2006, 04:25:43 #3
Daniel

Usere Online

Zitat von: vind
Wo ist dieser Ordner denn Lokal (in meinem fall apache) zu finden?


Moin!

Code:

<?php
session_save_path
&#40;'d&#58;/wohin_ich_will/'&#41;;
sesson_start&#40;&#41;;
?>

PHP benötigt Schreibrecht für den Ordner!! (in meinem Fall auf einem Win2k3 Server). Also bei anderen nicht MS-OS könnte der Pfad dann z.B. so aussehen:
/home/u/user1/public_html/secure/

Mit stat() kannst Du dann Dateiinfos auslesen.

Eine weitere Möglichkeit wäre, die Sache über eine SQL-Datenbank zu machen.
Datenbank SESSION anlegen mit Feldern: ID:SESS-ID:INSERT-DATE.
starten mit
Code:

<?php
session_start
&#40;&#41;;
//DATENBANKVERBINDUNG hier rein

if&#40;!$_SESSION[sess_id&#93;&#41; &#123;
$_SESSION[sess_id&#93;=session_id&#40;&#41;;
$date=time&#40;&#41;;
mysql_query&#40;"INSERT INTO SESSION &#40;SESS-ID, INSERT-DATE&#41; VALUES &#40;'$_SESSION[sess_id&#93;',$date&#41;", $db&#41;;
$_SESSION[sess_in&#93;= mysql_insert_id&#40;&#41;;
&#125;
else
&
#123;
$date=time&#40;&#41;;
mysql_query&#40;"UPDATE SESSION SET INSERT-DATE=$date WHERE id=$_SESSION[sess_in&#93;", $db&#41;;
&#125;
$activ=$date-300//300 sec
mysql_query&#40;"DELETE FROM SESSION WHERE INSERT-DATE<$activ", $db&#41;;

// Jetzt die Datenbank nach Anzahl abfragen

?>

Habe den Code nicht geprüft, muß gleich los zur Arbeit.

Daniel


Offline  
Read 31. Oktober 2006, 07:50:18 #4
inky

Usere Online

Also das von Daniel müsste schon passen. Ich hab das "User online" Script auch auf meiner Homepage allerdings anderst.

Ich möchte es auch zeigen und die Funktion/Denkweiße erklären

Gennerell direkt lässt es sich nicht zählen, ob und wieviel Besucher gerade online sind. Für meine Methode brauchen wir ne Datenbank. Dort speichern wir die ip des Besuchers und das Datum + Zeit zu dem Zeitpunkt, wo er gerade die Seite aufgerufen hat. Bsp. Besuer mit ip xxx.xxx.xxx.xx hat die Homepage um 17:15 Uhr betreten. Das ist jetzt abgespeichert.

Jetzt speichert es aber alle ab auch wenn diese schon n Tag vorher sind. Dazu müssen wir ältere Einträge löschen. Wir baun ein Script, das alle Einträge die älter sind wie 1 Minute löschen. Dann haben wir die Onlineanzahl der Besucher auf eine Minute genau.

Wenn ein Besucher aber schon Eingetragen ist und die seite weiter durchstöbert müssen wir bei jedem Seitenaufruf seine Zeit aktuell setzten, das er nicht gelöscht wird. Liest der Besucher jetzt aber 5 Minuten einen Text durch ist er ja noch online hat aber 5 Minuten  nicht seine Seite aktualisiert um seine Zeit wieder aktuell zu setzen. Sprich sie ist 5min alt und wird gelöscht, weil wir ja nur 1 Min. eingestellt haben. Ich Empfehle eine Zeit zwischen 5 und 10 Min. Sollte er dann Die seite immer noch nicht Aktualisieren wirds nichts ausmachen ihn Offline anzeigen zu lassen.

Zur Datenbank:
Das feld für Zeit und Datum muss als "datetime" angegeben werden


Mein script:
Code:


$ip = getenv("REMOTE_ADDR"); // Hier holen wir die ip des Besuchers
$abfrage = "SELECT * FROM useronline  WHERE ip='$ip'"; //Wir fragen in der Tabelle "useronline" alle einträge ab mit der ip des Besuchers
$result = mysql_query($abfrage) or die("Anfrage fehlgeschlagen: " . mysql_error());
$useronline= mysql_num_rows($result); //Wir zählen die Treffer

if ($useronline == "0") // Keine Treffer bedeutet das der Besucher noch nicht Eingetragen wurde
{
$eintrag = "INSERT INTO useronline
(ip, datum)
VALUES
('$ip', NOW())";
$eintragen = mysql_query($eintrag); // Wir tragen die ip und das jetzige Datum (NOW) in die Tabelle ein
}
else // Wenn der User schon eingetragen wurde müssen wir seine Zeit aktualisieren damit er nicht gelöscht wird
{
$aendern = "UPDATE useronline  Set datum = NOW() WHERE ip='$ip' LIMIT 1" ;
$update = mysql_query($aendern);
}
}
$sql = "DELETE FROM
useronline
WHERE
DATE_SUB(NOW(), INTERVAL 5 MINUTE) > datum";
mysql_query($sql) OR die(mysql_error());  // Mit diesem Befehl löschen wir alle Einträge die älter sind als 5 Minute




Und jetzt nur noch alle Einträge abfragen und Zählen schon hat man die Anzahl der Besucher, die sich gerade auf der Seite tummeln

Code:

<?
$abfrage = "SELECT * FROM useronline";
$result = mysql_query($abfrage) or die("Anfrage fehlgeschlagen: " . mysql_error());
$online = mysql_num_rows($result);

echo = "Besucher Online: $online";

?>



Tipp: Um das es funktioniert muss auf jeder seite dieses Script gesezt werden. Hilfreich ist es das Ding extra in ne Datei zu packen und dann per include auf jede seite einzufügen.

Ich hoff es ist verständlich geschrieben Smiley

ps: Der code ist nicht gerade kurz gehalten aber er ist mein geschmack und für mich so am übersichtlichsten
Offline  
Read 31. Oktober 2006, 15:18:06 #5
krafdi

Usere Online

Danke euch allen!
Ich habe mich für die variante mit DB entschieden. Habe nur noch ein Feld mit Uhrzeit angelegt und gebe diese dann noch mit aus! Auf Wunsch kann ich den Code noch Posten.

Grüße
Krafdi


Fehlender Plan wird durch Wahnsinn ersetzt!!Zunge
Offline  
Read 31. Oktober 2006, 15:19:48 #6
s.wokal

Usere Online

Klar würd mich freuen wenn du den Code noch reinschreibst! Kann immer Hilfreich sein!  Lächelnd

Danke


zu 80% Fertig!
Offline  
Read 31. Oktober 2006, 16:26:16 #7
vind

Usere Online

Zitat von: Daniel
Zitat von: vind
Wo ist dieser Ordner denn Lokal (in meinem fall apache) zu finden?


Moin!

Code:

<?php
session_save_path
&#40;'d&#58;/wohin_ich_will/'&#41;;
sesson_start&#40;&#41;;
?>

PHP benötigt Schreibrecht für den Ordner!! (in meinem Fall auf einem Win2k3 Server). Also bei anderen nicht MS-OS könnte der Pfad dann z.B. so aussehen:
/home/u/user1/public_html/secure/

Mit stat() kannst Du dann Dateiinfos auslesen.

Eine weitere Möglichkeit wäre, die Sache über eine SQL-Datenbank zu machen.
Datenbank SESSION anlegen mit Feldern: ID:SESS-ID:INSERT-DATE.
starten mit
Code:

<?php
session_start
&#40;&#41;;
//DATENBANKVERBINDUNG hier rein

if&#40;!$_SESSION[sess_id&#93;&#41; &#123;
$_SESSION[sess_id&#93;=session_id&#40;&#41;;
$date=time&#40;&#41;;
mysql_query&#40;"INSERT INTO SESSION &#40;SESS-ID, INSERT-DATE&#41; VALUES &#40;'$_SESSION[sess_id&#93;',$date&#41;", $db&#41;;
$_SESSION[sess_in&#93;= mysql_insert_id&#40;&#41;;
&#125;
else
&
#123;
$date=time&#40;&#41;;
mysql_query&#40;"UPDATE SESSION SET INSERT-DATE=$date WHERE id=$_SESSION[sess_in&#93;", $db&#41;;
&#125;
$activ=$date-300//300 sec
mysql_query&#40;"DELETE FROM SESSION WHERE INSERT-DATE<$activ", $db&#41;;

// Jetzt die Datenbank nach Anzahl abfragen

?>

Habe den Code nicht geprüft, muß gleich los zur Arbeit.

Daniel



Danke, werde es die kommende Woche mal ausprobieren!
Offline  
Read 31. Oktober 2006, 20:56:29 #8
krafdi

Usere Online

Zu erst habe ich folgende Tabelle angelegt.
Code:
CREATE TABLE sm_useronline (
  kid int(11) NOT NULL auto_increment,
  id char(255) default NULL,
  ip char(255) default NULL,
  name char(255) default NULL,
  zeitid char(255) default NULL,
  PRIMARY KEY  (kid)
) TYPE=MyISAM CHARSET=latin1;

Danach habe ich in eine zentrale datei welche ich include (functions.php) folgenden Code geschrieben.
Code:
<?php

// Onlineuser Tabelle
$logtab "sm_userstats";
// Zeitlimit in Sekunden
$zeitlimit "600";
// Zeit und Datum
$aktzeit=date&#40;"d-m-Y H&#58;i"&#41;;

$zeit explode&#40; " ", microtime&#40;&#41;&#41;;
$userusek = &#40;double&#41;$zeit[0&#93;;
$usersek = &#40;double&#41;$zeit[1&#93;;
$User_Id $usersek $userusek;
$IP getenv&#40;REMOTE_ADDR&#41;;

// Onlineuser entfernen, sobald das Zeitlimit
// überschritten wurde
mysql_query&#40;"delete from $logtab where zeitid < $usersek -$zeitlimit"&#41;;

// IP-Adresse prüfen
$satz mysql_query&#40;"SELECT * FROM $logtab where ip like '$IP'"&#41;;
@$userlog mysql_fetch_row&#40;$satz&#41;;

// Neuen Onlineuser hinzufügen fals IP-Adresse
// noch nicht in der logtab vorhanden
if &#40;$userlog == false&#41; &#123;
 
mysql_query&#40;"insert INTO $logtab &#40;id,ip,name,zeitid&#41;
 
VALUES&#40;'$User_Id','$IP','$_SERVER[HTTP_HOST&#93;','$usersek'&#41;"&#41; or die&#40;$db_fehler2&#41;;
&#125;

// Anzahl der Onlineuser ermitteln
$res_logtab mysql_query&#40;"SELECT Count&#40;*&#41; as gesamt FROM $logtab"&#41;;
$numberlogtab mysql_fetch_array&#40;$res_logtab&#41;;

// Anzahl der Online-User ausgeben
if &#40;!empty&#40;$numberlogtab[gesamt&#93;&#41;&#41;&#123;
 
$useronline "$numberlogtab[gesamt&#93;";
 
$akttime "$aktzeit";
&
#125;

?>



Diesen binde ich per require ("./functions.php"); die Datei ein.

Danach kann ich an jeder beliebigen stelle mit $useronline die Anzahl der aktuellen Online user ausgeben und mit $akttime die Zeit des letzten Seiten Aufrufs.


Fehlender Plan wird durch Wahnsinn ersetzt!!Zunge
Offline  
Read 01. November 2006, 05:39:13 #9
Daniel

Usere Online

Guten Morgen,

finde die Variante mit der IP auch recht gut, allerdings ist mir da beim testen etwas aufgefallen:

Ich habe in meinem privaten Netzwerk 5 PC's, wenn alle auf der Seite sind wird aber trotzdem nur 1 User online angezeigt. Liegt das am IP-Sharing?

Daniel


Offline  
Read 01. November 2006, 09:45:19 #10
Zabi

Usere Online

Zitat von: Daniel

Ich habe in meinem privaten Netzwerk 5 PC's, wenn alle auf der Seite sind wird aber trotzdem nur 1 User online angezeigt. Liegt das am IP-Sharing?

Daniel


Es liegt am sog. "Natting" - du benutzt lokal völlig andere IP Adressen als extern. Nach außen hin wirkt es immer so als ob nur ein PC da wäre.


Die Neugier steht immer an erster Stelle eines Problems, das gelöst werden will.
(Galileo Galilei)

www.zabulus.de
Offline  
Read 05. November 2006, 15:38:55 #11
vind

Usere Online

Zitat von: krafdi
Zu erst habe ich folgende Tabelle angelegt.
Code:
CREATE TABLE sm_useronline (
  kid int(11) NOT NULL auto_increment,
  id char(255) default NULL,
  ip char(255) default NULL,
  name char(255) default NULL,
  zeitid char(255) default NULL,
  PRIMARY KEY  (kid)
) TYPE=MyISAM CHARSET=latin1;

Danach habe ich in eine zentrale datei welche ich include (functions.php) folgenden Code geschrieben.
Code:
<?php

// Onlineuser Tabelle
$logtab "sm_userstats";
// Zeitlimit in Sekunden
$zeitlimit "600";
// Zeit und Datum
$aktzeit=date&#40;"d-m-Y H&#58;i"&#41;;

$zeit explode&#40; " ", microtime&#40;&#41;&#41;;
$userusek = &#40;double&#41;$zeit[0&#93;;
$usersek = &#40;double&#41;$zeit[1&#93;;
$User_Id $usersek $userusek;
$IP getenv&#40;REMOTE_ADDR&#41;;

// Onlineuser entfernen, sobald das Zeitlimit
// überschritten wurde
mysql_query&#40;"delete from $logtab where zeitid < $usersek -$zeitlimit"&#41;;

// IP-Adresse prüfen
$satz mysql_query&#40;"SELECT * FROM $logtab where ip like '$IP'"&#41;;
@$userlog mysql_fetch_row&#40;$satz&#41;;

// Neuen Onlineuser hinzufügen fals IP-Adresse
// noch nicht in der logtab vorhanden
if &#40;$userlog == false&#41; &#123;
 
mysql_query&#40;"insert INTO $logtab &#40;id,ip,name,zeitid&#41;
 
VALUES&#40;'$User_Id','$IP','$_SERVER[HTTP_HOST&#93;','$usersek'&#41;"&#41; or die&#40;$db_fehler2&#41;;
&#125;

// Anzahl der Onlineuser ermitteln
$res_logtab mysql_query&#40;"SELECT Count&#40;*&#41; as gesamt FROM $logtab"&#41;;
$numberlogtab mysql_fetch_array&#40;$res_logtab&#41;;

// Anzahl der Online-User ausgeben
if &#40;!empty&#40;$numberlogtab[gesamt&#93;&#41;&#41;&#123;
 
$useronline "$numberlogtab[gesamt&#93;";
 
$akttime "$aktzeit";
&
#125;

?>



Diesen binde ich per require ("./functions.php"); die Datei ein.

Danach kann ich an jeder beliebigen stelle mit $useronline die Anzahl der aktuellen Online user ausgeben und mit $akttime die Zeit des letzten Seiten Aufrufs.



Wieso gleich eine neue Tabelle anlegen? Wenn du ein usersystem hast kannst du es ja direkt in die Tabelle mit den Benutzernamen einarbeiten.

Warum ich darauf hinweise? Billige Hosts haben immer eine limitierte Anzahl von DB's und Tabellen, die man einrichten kann. Aber naja, Lokal zum testen isses ja egal.
Offline  
Read 11. November 2006, 00:34:26 #12
Oetzi

Usere Online

Zitat von: Daniel


Ich habe in meinem privaten Netzwerk 5 PC's, wenn alle auf der Seite sind wird aber trotzdem nur 1 User online angezeigt. Liegt das am IP-Sharing?



naja das liegt an der Trennung WAN und LAN durch deinen Router. Weil für den Webserver nur die WAN-IP sichtbar ist und dein Router des dann nach intern entsprechend verteilt. Das ist dann natürlich nicht nur bei dir daheim so sondern auch bei Uni-Netzwerken, Firmen-Netzwerken usw. Also allen Netzen wo mehrere Rechner in einem LAN zusammengefasst sind und über ein gemeinsames Gateway die Internetverbindung herstellen. Wenn du trotzdem alle online-pcs aufgelistet haben möchtest bleibt dir eigentlich nur die Möglichkeit des sauber zu lösen über den Vorschlag mit den sessions zu arbeiten. Aber vllt kannst du auch ne Kombination aus beidem machen.
Nämlich ne DB-Lösung wie oben vorgeschlagen nur anstelle der ip-adresse
die session-id speichern. Die bekommst du mit  der Funktion session_id(), Diese sollte wenn dein Webserver richtig konfiguriert ist eigentlich aufjedenfall eindeutig für jeden Browser sein für eine längere Zeitspanne.


Sag niemals nie, es sei denn du meinst es ernst?

Johannes Ott
Webmaster My Tie - Rock&Pop Covers
Webmaster Jugendkirche Nürnberg
Offline  
Read 11. November 2006, 01:10:25 #13
Oetzi

Usere Online

Mein vorgeschlagene Tabelle würde wie folgt ausschauen

Code:

CREATE TABLE `online_user` (
`id` INT( 10 ) UNSIGNED NOT NULL AUTO_INCREMENT ,
`session_id` VARCHAR( 255 ) NOT NULL ,
`last_klick` TIMESTAMP DEFAULT CURRENT_TIMESTAMP NOT NULL ,
PRIMARY KEY ( `id` ) ,
INDEX ( `session_id` )
);


und der entsprechende php-code

Code:

<?php
session_start
&#40;&#41;;

$limit 10 //minuten

//open db-connection

mysql_query&#40;"UPDATE online_users 
                        
SET last_klick=NOW&#40;&#41; 
                        
WHERE session_id='".session_id&#40;&#41;."'"&#41;;

if &#40;mysql_affected_rows&#40;&#41; == 0&#41; &#123;

   mysql_query&#40;"
INSERT INTO online_users
                           
&#40;session_id&#41;
                           
VALUES
                           
&#40;'".session_id&#40;&#41;."'&#41;"&#41;;

&#125;

mysql_query&#40;"DELETE FROM online_users 
                           
WHERE last_klick <  DATE_SUB&#40;NOW&#40;&#41;, INTERVAL ".$limit." MINUTE&#41;"&#41;;

$result mysql_query&#40;SELECT COUNT&#40;*&#41; as users FROM online_users&#41;;

$anzahl mysql_result &#40;$result, 0, "users"&#41;;

?>




Sag niemals nie, es sei denn du meinst es ernst?

Johannes Ott
Webmaster My Tie - Rock&Pop Covers
Webmaster Jugendkirche Nürnberg
Offline  
Seiten: [1]
Gehe zu: