Цикл всех сеансов сервера в PHP - PullRequest
42 голосов
/ 24 марта 2009

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

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

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

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

Ответы [ 4 ]

42 голосов
/ 24 марта 2009

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 без необходимости разбирать сами файлы содержимого. Кто-нибудь может подтвердить, возможно ли это?

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

7 голосов
/ 21 февраля 2013

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

<?php
print_r(scandir(session_save_path()));
?>
4 голосов
/ 19 сентября 2017

Это даст вам данные для всех сессий, сохраненные в массиве и проиндексированные по идентификатору сессии:

<?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);
0 голосов
/ 18 декабря 2018

Я использовал метод @mgroat в вызове ajax, но в заголовке ответа HTTP есть проблема, что заголовок Set-Cookie появляется несколько раз, а jQuery сообщает об ошибке:

Заголовок Set-Cookie игнорируется в ответе от URL: mysite.com/admin/ajax/main_ajax. Длина куки должна быть меньше не более 4096 символов.

Решение состоит в том, чтобы добавить header_remove("Set-Cookie") сразу после session_start().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...