2009-03-24 3 views
39

Gibt es einen Weg in PHP, um eine Liste aller Sitzungen (und der Variablen in jedem) auf dem Server zu bekommen?Looping durch alle Sitzungen eines Servers in PHP

Im Grunde haben wir eine Wartungsfunktion, die wissen muss, welche Benutzer gerade auf der Site angemeldet sind. Wir speichern bereits Daten für jeden Benutzer in einer Sitzungsvariablen, aber ich hoffe, dass ich jede dieser Sitzungen durchlaufen und die benötigten Daten auslesen kann.

Mein PHP ist sehr begrenzt (Ich bin ein .Net-Entwickler gewöhnlich), aber wenn jemand weiß, ob das überhaupt möglich ist (und wie es geht), wäre ich sehr dankbar. Ich habe das gegoogelt, und die Ergebnisse, die ich fand, neigten dazu zu sagen, dass es NICHT möglich war, aber ich finde das sehr schwer zu akzeptieren.

Immer noch, wenn du nicht kannst, aber ich dachte, meine Freunde auf StackOverflow könnten mir eine definitive Antwort geben!

Antwort

38

PHP speichert Sitzungsdaten für jeden Benutzer in einem temporären Ordner auf dem Server. Dieser Ordner ist in der Konfigurationsdatei php.ini unter der Variablen session.save_path definiert. Suchen Sie diesen Wert aus Ihrer php.ini, oder alternativ, erstellen Sie eine PHP-Datei mit:

<?php echo "Session Save Path: " . ini_get('session.save_path');?> 

wie es Inhalt ist, und öffnen Sie die Datei in Ihrem Browser.

Sobald Sie den Speicherpfad für die Sitzungsdaten gefunden haben, öffnen Sie diesen Ordner und Sie werden eine ziemlich einfache Struktur bemerken. Alle Sitzungen werden im folgenden Format gespeichert: sess_ $ SESSIONID.

Sitzungsdaten werden serialisiert, bevor sie auf der Festplatte gespeichert werden. Daher müssen Objekte, die in der Sitzungsdatei gespeichert sind, deserialisiert werden, bevor sie verwendet werden können. Wenn Sie jedoch unverschlüsselten Text verwenden, um Ihre Sitzungsdaten (z. B. $_SESSION['userid'] = 1234) zu speichern, um Informationen über Ihre Benutzer zu speichern, sollte es einfach genug sein, die gesuchten Daten zu analysieren innerhalb der Dateien.

Noch eine Sache ... Ich habe nicht nachgeschaut, aber es scheint, als ob die Sitzungs-ID, die im Dateinamen erscheint, direkt mit dem Namen des PHPSESSID-Cookies auf dem Computer des Benutzers übereinstimmt. Aus diesem Grund ist es möglich, die Dateien innerhalb des temporären Sitzungsverzeichnisses zu durchlaufen, alle $ SESSIONID-Werte abzurufen, die aktuelle Sitzungs-ID mit session_id($SESSIONID) festzulegen, eine Sitzung mit session_start() zu starten und über PHP auf die benötigten Daten zuzugreifen ohne die Inhaltsdateien selbst analysieren zu müssen. Kann jemand bestätigen, ob das möglich wäre?

Bearbeiten: Angepasster Beitrag, um Itay's Kommentar zu entsprechen.

+13

Es ist erwähnenswert, dass diese Art von Hacks eine schreckliche Idee sind. PHP hat "teilen nichts" -Architektur und versucht, es zu hacken wäre wie mit einem Schraubenzieher zum Pflanzen von Nägeln. Anstatt die internen Dateien von serwer zu analysieren, erstellen Sie Ihre eigene oder verwenden Sie besser die Datenbank, um alles zu erhalten, was Sie brauchen. – smentek

+0

php hat die Option, Sitzungsdaten im Speicher zu speichern. Nicht immer können wir sie aus Dateien herausholen. – jondinham

+1

und mehr, diese "ses_ *" Dateien können unter einer mehrstufigen Struktur von Verzeichnissen platziert werden. das ist, was in php.net gesagt wurde – jondinham

6

Hier ist ein prägnanter Weise eine Liste der Sitzungen über die gespeicherten Dateien zu erhalten:

Diese
<?php 
print_r(scandir(session_save_path())); 
?> 
0

finden Sie die Daten für alle Sitzungen, gespeichert in einem Array erhalten und von Session-ID indiziert:

<?php 
$allSessions = []; 
$sessionNames = scandir(session_save_path()); 

foreach($sessionNames as $sessionName) { 
    $sessionName = str_replace("sess_","",$sessionName); 
    if(strpos($sessionName,".") === false) { //This skips temp files that aren't sessions 
     session_id($sessionName); 
     session_start(); 
     $allSessions[$sessionName] = $_SESSION; 
     session_abort(); 
    } 
} 
print_r($allSessions);