2009-03-24 21 views
39

C'è un modo in PHP per ottenere un elenco di tutte le sessioni (e le variabili all'interno di ciascuna) sul server?Looping attraverso tutte le sessioni di un server in PHP

Fondamentalmente, abbiamo una funzione di manutenzione che deve sapere quali utenti sono attualmente connessi al sito. Archiviamo già dati per ogni utente in una variabile di sessione, ma spero di poter scorrere ciclicamente ciascuna di queste sessioni e raccogliere i dati di cui ho bisogno.

MY PHP è molto limitato (io sono uno sviluppatore .Net ussually) ma se qualcuno sa se questo è anche possibile (e come farlo) sarei molto grato. L'ho cercato su Google, e i risultati che ho trovato tendevano a indicare che non era possibile, ma lo trovo molto difficile da accettare.

Ancora, se non puoi non puoi, ma ho pensato che i miei amici su StackOverflow mi avrebbero dato una risposta definitiva!

risposta

38

PHP memorizza i dati di sessione per ciascun utente in una cartella temporanea sul server. Questa cartella è definita nel file di configurazione php.ini sotto la variabile session.save_path. Individuare questo valore all'interno del tuo file php.ini, o, in alternativa, creare un file php con:

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

come il suo contenuto, e aprire il file nel browser.

Una volta trovato il percorso di salvataggio per i dati di sessione, apri quella cartella e noterai una struttura abbastanza semplice. Tutte le sessioni sono memorizzate nel formato: sess_ $ SESSIONID.

I dati di sessione vengono serializzati prima di essere memorizzati su disco. Pertanto, gli oggetti memorizzati nel file di sessione dovrebbero essere deserializzati prima di poter essere utilizzati. Tuttavia, se stai utilizzando un testo normale, che viene archiviato così com'è, per memorizzare i tuoi dati di sessione (ad esempio $_SESSION['userid'] = 1234) per archiviare le informazioni sui tuoi utenti, dovrebbe essere abbastanza semplice da analizzare i dati che stai cercando da all'interno dei file.

Un'altra cosa ... Non l'ho esaminato, ma sembra che l'ID di sessione che appare nel nome del file corrisponda direttamente, ad esempio, al nome del cookie PHPSESSID memorizzato sul computer dell'utente. Pertanto, tenendo presente questo, è possibile scorrere i file all'interno della directory della sessione temporanea, acquisire tutti i valori $ SESSIONID, impostare l'ID della sessione corrente utilizzando session_id($SESSIONID), avviare una sessione con session_start() e accedere ai dati necessari tramite PHP. senza dover analizzare i file dei contenuti stessi. Qualcuno può confermare se questo sarebbe possibile o no?

Modifica: Post corretto per abbinare il commento di Itay.

+13

Vale la pena menzionare che questo tipo di hack è una pessima idea. PHP ha l'architettura 'condividi niente' e provare a modificarlo sarebbe come usare un cacciavite per piantare chiodi. Invece di analizzare i file interni di serwer, creane uno tuo, o meglio usa il database per mantenere tutto ciò che ti serve. – smentek

+0

php ha l'opzione per salvare i dati di sessione in memoria. non sempre possiamo ricavarle dai file. – jondinham

+1

e molto altro, quei file "ses_ *" possono essere collocati in una struttura multilivello di directory. questo è quello che viene detto in php.net – jondinham

6

Ecco un modo più succinto per ottenere un elenco di sessioni tramite i file memorizzati:

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

questo modo si ottiene i dati per tutte le sessioni, memorizzati in un array e indicizzati da id di sessione:

<?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);