PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Prüfen ob bestimmte Session-ID existiert


cIph3r
30.06.2008, 17:17:29
Hallo,

da meine Frage ziemlich speziell ist und ich beim suchen nie das gefunden hab, was ich brauch, frag ich also mal selber nach:

Mein Problem ist folgendes:

Ich habe in einer Datenbank gespeichert, welche user gerade online sind (für ein Chat).
Jeder user bekommt also eine Session beim Betreten der gesamten Seite und eine login-SESSION-variable, wenn er den chat betritt und wird dann in der datenbank erfasst.


Meldet er sich wieder ab, wird der Name auch aus der Datenbank entfernt.

Meldet er sich jedoch nicht ab, bleibt sein name in der datenbank und wird als online aufgelistet, ist es aber lange nicht mehr (nach 1h inaktivität ist ers zwar, aber das geht zu lange)

Und genau da ist das Problem:
Wie kann ich rausfinden, ob der User noch online ist.

Da gabs 2 Ansätze:
1. Ein Script ausführen, wenn der User den Chat verlässt, welches den Namen aus der DB entfernt.
Problem: php geht ja nur beim betreten der seite, nicht aber beim verlassen.
Also das wäre die elegantere lösung, hab aber keine Ahnung, wie das gehen soll.

2. Über Sessions:
Das geht zwar nur eingeschränkt, also wenn der Browser beendet wird oder eben über abmelden, aber ist die einzige alternative, die mir einfällt.

Die idee war, nicht nur den namen, sondern auch die Sess-Id zu speichern und dann regelmäßig zu prüfen, ob die Session-Ids aus der Datenbank noch auf dem Server existieren und ggf. dann die Namen aus der DB zu löschen.
Aber ich habe keine funktion in php gefunden, mit der ich überprüfen kann, ab eine bestimmte Session-ID auf dem server existiert.

Ich glaube, das war schon deutlich genug formuliert, aber ich fass es nochmal zusammen:
-User wird mit seiner SID zusammen erfasst und als online registriert.
-User meldet sich nicht ab, aber session wird beendet
Problem: Wie prüfen, ob die SID "80c94f533ce847d58a5d31ce1e607232" noch existiert.

Alternative:
Beim verlassen des Chats wird der Benutzer (wenn das irgendwie geht) aus der Datenbank gelöscht.

Noch kurz zur info:
Bei mir gibts keine Anmeldungen im klassischen Sinne
Also kein Passwort, sondern nur Nickname und los gehts.


Ich danke schonmal fürs lesen und evtl auch für ne gute Antwort

Domi
30.06.2008, 17:52:44
Hi und erstmal herzlich willkommen im Forum.

Also prinzipiell mache ich das so: Jedesmal wenn eine PHP-Seite geladen wird, dann aktualisiere ich den Timestamp. So sehe ich wann der Benutzer das letzte mal was gemacht hat und so kann ich entscheiden ob er noch aktiv was macht oder ob er bereits weg ist.

In wie fern sich das mit deinem Chat realisieren lässt müsste man noch checken. Aber ich denke auch das ist auf jeden Fall möglich. Aber um was für ein Chat handelt es sich denn? Komplett in PHP geschrieben? Wenn dies der Fall ist, dann brauchst du ja einen Reload um die Texte der anderen aus der DB zu lesen, in diese Moment könntest den Timestamp aktualisieren. So kannst dann sagen, dass alle die älter wie 5 Minuten sind einfach nicht mehr on sind. Wenn du das jede Sekunde aktualisierst, könntest das z.B. auf 10 Sekunden herunterschrauben..

Ich hoffe ich konnte dich etwas inspirieren, damit du der Lösung näher kommst.

Domi

cIph3r
30.06.2008, 18:02:03
Danke für die schnelle Antwort


der Chat funktioniert so:
Über Ajax wird ein Script aufgerufen, welches die Posts aus der datenbank holt

also die seite wird nie komplett neu geladen

die Fragen bleiben beide offen:
1. Kann man mit php feststellen, ob eine bestimmte Session-Id existiert
und
2. Kann man beim Verlassen der Chatseite irgendwie ein Löschbefehl an die Datenbank senden

mit Timeouts wollte ich eben nicht arbeiten, weil die sehr unzuverlässig sind.
Ich habe ja einen eingebunden, der nach 1 stunde checkt, ob der user noch aktiv ist
aber weiter runter wollte ich den timeout nicht setzen (habe selber mal einen langen Text verfasst und nachdem ich auf senden geklickt habe, war alles weg, weil meine Session abgelaufen war [zurück] ging auch nicht mehr (ist schon etwas länger her aber da hab ich mir gesagt, sowas schreib ich nicht, auch nicht, wenn die posts nur 20 wörter lang sind)

Domi
30.06.2008, 18:08:16
Na, das ist schon klar, aber die Beiträge werden ja eh alle x-Zeiteinheiten aktualisiert, in dem Zug aktualisierst du auch den Timestamp. Wenn der Benutzer keine Beiträge mehr bekommt, dann ist er ja eh "draußen" .. so merkst innerhalb 2*x-Zeiteinheiten ob er noch da ist oder net.

Die anderen Fragen kann ich dir momentan net beantworten, würde mich da aber auch net auf eine Lösung versteifen.

Domi

cIph3r
30.06.2008, 18:12:39
ich glaube, ich hab gecheckt, was du meinst

werd ich gleich mal testen

darauf bin ich noch garnicht gekommen, wenn es wirklich das is, was ich denke


thx

cIph3r
30.06.2008, 19:26:17
jep, so gehts
dass ich da nicht selber drauf gekommen bin

hatte den timestamp nur beim schreiben vergeben, aber beim lesen gehts ja genauso

die Antwort auf meine Frage is jetzt zwar nicht mehr so wichtig
aber interessieren würds mich dennoch

also wenn da jemand was weiß, wie man die aktiven sessions auslesen kann,

war cool

Domi
30.06.2008, 20:57:17
Das ist son Punkt den ich über die Jahre gelernt hab .. man darf nicht auf ner Idee verharren, man muss sich auch mal auf andere Ideen einlassen :)

deedee
02.07.2008, 01:11:29
jalso wenn da jemand was weiß, wie man die aktiven sessions auslesen kann,

war cool

Sessions sind aus zu lesen - zum beispiel:

<?php
session_start();
$path = ini_get('session.save_path');
$handle = dir($path);
while ($filename = $handle->read()) {
if (substr($filename, 0, 5) == 'sess_')
{
$data = file_get_contents("$path/$filename");

if (!empty($data))
{
session_decode($data);
$session = $_SESSION;
$_SESSION = array();
echo "Session [" . substr($filename, 5) . "] <br>\n";
print_r($session);
echo "<br>\n\n";
}
}
}
?>


Von: http://phpsecurity.org/code/ch08-1

By einen shared host ist es besser dein eigenen session handler zu machen

cortex
02.07.2008, 10:05:26
Sessions sind aus zu lesen - zum beispiel:

[...] php-code [...]



damit kannst die in einer session gespeicherten daten auslesen - ob die session noch aktiv ist (im sinne von "ob der user noch online ist"), steht auf einem anderen blatt.

by einen shared host ist es besser dein eigenen session handler zu machen

das ist ein weit verbreitetes vorurteil / eine zu pauschale einschätzung. gute hoster verstehen ihr handwerk und erzielen durch die konfiguration des webspace eine höhere sicherheit, als das die meisten coder mit irgendwelchen selbstgebastelten skripten hinbekommen.

cx