2009-03-24 3 views
39

Есть ли способ в PHP получить список всех сеансов (и переменных внутри каждого) на сервере?Looping через все сеансы сервера в PHP

В принципе, у нас есть функция технического обслуживания, которая должна знать, какие пользователи в настоящее время зарегистрированы на сайте. Мы уже храним данные для каждого пользователя в переменной сеанса, но я надеюсь, что смогу пройти через каждый из этих сеансов и вырвать нужные мне данные.

MY PHP очень ограничен (я - разработчик .Net), но если кто-нибудь знает, возможно ли это (и как это сделать), я был бы очень благодарен. Я искал это в googled, и результаты, которые, как я нашел, имели тенденцию скрывать, что это НЕ возможно, но я нахожу это очень трудно принять.

Тем не менее, если вы не можете, вы не можете, но я думал, что мои приятели на StackOverflow могут дать мне окончательный ответ!

ответ

38

PHP хранит данные сеанса для каждого пользователя во временной папке на сервере. Эта папка определена в файле конфигурации php.ini в переменной session.save_path. Найдите это значение из вашего файла php.ini, или в качестве альтернативы, создать PHP файл с:

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

, как его содержимое, и открыть файл в вашем браузере.

Как только вы найдете путь сохранения данных сеанса, откройте эту папку, и вы заметите довольно простую структуру. Все сеансы хранятся в формате: sess_ $ SESSIONID.

Данные сеанса сериализованы перед сохранением на диске. Таким образом, объекты, хранящиеся в файле сеанса, должны быть десериализованы перед использованием. Однако, если вы используете обычный текст, который хранится как есть, для хранения ваших данных сеанса (например, $_SESSION['userid'] = 1234) для хранения информации о ваших пользователях, должно быть достаточно просто проанализировать данные, которые вы ищете в файлах.

Еще одна вещь ... Я не изучал ее, но кажется, что идентификатор сеанса, который появляется в имени файла, напрямую соответствует, например, имени файла cookie PHPSESSID, хранящегося на компьютере пользователя. Таким образом, имея в виду это, возможно, можно пропустить файлы в каталоге временного сеанса, получить все значения $ SESSIONID, установить текущий идентификатор сеанса с помощью session_id($SESSIONID), начать сеанс с session_start() и получить доступ к данным, которые вам нужны через PHP без необходимости самостоятельно анализировать сами файлы содержимого. Может ли кто-нибудь подтвердить, возможно ли это?

Редактировать: Скорректированный пост, чтобы ответить на комментарий Итай.

+13

Стоит упомянуть, что такие хаки - ужасная идея. PHP не имеет ничего общего с архитектурой, и попытка взломать его будет похожа на использование отвертки для посадки ногтей. Вместо того, чтобы анализировать внутренние файлы serwer, создайте свою собственную или лучше используйте базу данных, чтобы сохранить все, что вам нужно. – smentek

+0

У php есть возможность сохранять данные сеанса в памяти. не всегда мы можем получить их из файлов. – jondinham

+1

и более, эти файлы «ses_ *» могут быть помещены в многоуровневую структуру каталогов. это то, что сказано в php.net – jondinham

6

Вот более сжато способ получить список сеансов с помощью сохраненных файлов:

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

Это позволит получить вам данные для всех сеансов, хранящихся в массиве и индексируются идентификатором сессии:

<?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); 
Смежные вопросы