2009-03-24 6 views
39

Existe-t-il un moyen en PHP d'obtenir une liste de toutes les sessions (et les variables de chacune) sur le serveur? Fondamentalement, nous avons une fonction de maintenance qui a besoin de savoir quels utilisateurs sont actuellement connectés sur le site. Nous stockons déjà des données pour chaque utilisateur dans une variable de session, mais j'espère pouvoir parcourir chacune de ces sessions et extraire les données dont j'ai besoin.Mise en boucle de toutes les sessions d'un serveur en PHP

Mon PHP est très limité (je suis un développeur .Net ussually) mais si quelqu'un sait si c'est même possible (et comment le faire) je serais très reconnaissant. Je l'ai googlé, et les résultats que j'ai trouvés tendaient à indiquer que ce n'était pas possible, mais je trouve cela très difficile à accepter. Pourtant, si vous ne pouvez pas vous ne pouvez pas mais je pensais que mes copains sur StackOverflow pourraient me donner une réponse définitive!

Répondre

38

PHP stocke les données de session pour chaque utilisateur dans un dossier temporaire sur le serveur. Ce dossier est défini dans le fichier de configuration php.ini sous la variable session.save_path. Repérez cette valeur à partir de votre fichier php.ini, ou encore, créer un fichier php avec:

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

comme son contenu, et ouvrez le fichier dans votre navigateur. Une fois que vous avez trouvé le chemin de sauvegarde pour les données de session, ouvrez ce dossier et vous remarquerez une structure assez simple. Toutes les sessions sont stockées au format: sess_ $ SESSIONID.

Les données de session sont sérialisées avant d'être stockées sur le disque. En tant que tels, les objets stockés dans le fichier de session devraient être désérialisés avant d'être utilisables. Toutefois, si vous utilisez du texte brut, stocké tel quel, pour stocker vos données de session (par exemple $_SESSION['userid'] = 1234) pour stocker des informations sur vos utilisateurs, il devrait être assez facile d'analyser les données que vous recherchez. dans les fichiers.

Encore une chose ... Je ne l'ai pas examiné, mais il semble que l'ID de session qui apparaît dans le nom de fichier corresponde directement, par exemple, au nom du cookie PHPSESSID stocké sur l'ordinateur de l'utilisateur. Donc, dans cet esprit, il peut être possible de parcourir les fichiers dans le répertoire de session temporaire, acquérir toutes les valeurs $ SESSIONID, définir l'ID de session en cours en utilisant session_id($SESSIONID), démarrer une session avec session_start() et accéder aux données dont vous avez besoin via PHP sans avoir à analyser les fichiers de contenu eux-mêmes. Quelqu'un peut-il confirmer si oui ou non cela serait possible?

Modifier: Ajusté pour correspondre au commentaire d'Itay.

+13

Il vaut la peine de mentionner que ce genre de hacks sont une idée terrible. PHP a «ne rien partager» l'architecture et essayer de pirater ce serait comme utiliser un tournevis pour planter des ongles. Au lieu d'analyser les fichiers internes serwer créer votre propre, ou mieux utiliser la base de données pour persister tout ce dont vous avez besoin. – smentek

+0

php a l'option d'enregistrer les données de session en mémoire. pas toujours nous pouvons les sortir des fichiers. – jondinham

+1

et plus, ces fichiers "ses_ *" peuvent être placés sous une structure de répertoires à plusieurs niveaux. c'est ce qui est dit dans php.net – jondinham

6

est ici une façon plus succincte pour obtenir une liste de sessions via les fichiers stockés:

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

Cela vous obtenir les données pour toutes les sessions, stockées dans un tableau et indexés par ID de session:

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