2009-03-24 23 views
39

¿Hay alguna forma en PHP para obtener una lista de todas las sesiones (y las variables dentro de cada una) en el servidor?Looping a través de todas las sesiones de un servidor en PHP

Básicamente, tenemos una función de mantenimiento que necesita saber qué usuarios están actualmente conectados al sitio. Ya almacenamos datos para cada usuario en una variable de sesión, pero espero poder recorrer cada una de estas sesiones y obtener los datos que necesito.

MY PHP es muy limitado (usualmente soy desarrollador de .Net) pero si alguien sabe si esto es posible (y cómo hacerlo), estaría muy agradecido. Busqué en Google esto, y los resultados que encontré tendían a suponer que no era posible, pero me parece muy difícil de aceptar.

Aún así, si no puedes, no puedes, pero pensé que mis amigos en StackOverflow podrían darme una respuesta definitiva.

Respuesta

38

PHP almacena datos de sesión para cada usuario en una carpeta temporal en el servidor. Esta carpeta se define en el archivo de configuración php.ini bajo la variable session.save_path. Localizar este valor desde el interior de su archivo php.ini, o alternativamente, crear un archivo PHP con:

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

como su contenido, y abrir el archivo en su navegador.

Una vez que encuentre la ruta de guardado para los datos de la sesión, abra esa carpeta y verá una estructura bastante simple. Todas las sesiones se almacenan en el formato: sess_ $ SESSIONID.

Los datos de sesión se serializan antes de almacenarse en el disco. Como tal, los objetos almacenados en el archivo de la sesión tendrían que ser deserializados antes de ser utilizables. Sin embargo, si está utilizando texto sin formato, que está almacenado tal cual, para almacenar sus datos de sesión (por ejemplo, $_SESSION['userid'] = 1234) para almacenar información sobre sus usuarios, debería ser fácil analizar los datos que está buscando. dentro de los archivos.

Una cosa más ... No he investigado, pero parece que la ID de sesión que aparece en el nombre de archivo corresponde directamente, por ejemplo, al nombre de la cookie PHPSESSID almacenada en la computadora del usuario. Entonces, con esto en mente, es posible recorrer los archivos dentro del directorio de sesión temporal, adquirir todos los valores de $ SESSIONID, establecer la ID de sesión actual usando session_id($SESSIONID), iniciar una sesión con session_start() y acceder a los datos que necesita a través de PHP sin tener que analizar los archivos de contenido por sí mismos. ¿Alguien puede confirmar si esto sería posible o no?

Editar: Publicación ajustada para que coincida con el comentario de Itay.

+13

Vale la pena mencionar que este tipo de pirateo es una idea terrible. PHP tiene una arquitectura de 'no compartir nada' y tratar de hackearlo sería como usar un destornillador para plantar las uñas. En lugar de analizar los archivos internos del servidor, cree uno propio o mejor utilice la base de datos para conservar lo que necesite. – smentek

+0

php tiene la opción de guardar los datos de la sesión en la memoria. no siempre podemos sacarlos de los archivos. – jondinham

+1

y más, esos archivos "ses_ *" pueden colocarse bajo una estructura de directorios de varios niveles. esto es lo que dice en php.net – jondinham

6

Aquí está una manera más sucinta para obtener una lista de las sesiones a través de los archivos almacenados:

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

Esto obtendrá los datos de todas las sesiones, almacenados en una matriz y un índice por ID de sesión:

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