Заполнение всех сеансов сервера в PHP
Есть ли способ в PHP получить список всех сеансов (и переменных внутри каждого) на сервере?
В принципе, у нас есть функция обслуживания, которая должна знать, какие пользователи в настоящее время зарегистрированы на сайте. Мы уже храним данные для каждого пользователя в переменной сеанса, но я надеюсь, что смогу пройти через каждый из этих сеансов и вырвать нужные мне данные.
MY PHP очень ограничен (я - разработчик .Net), но если кто-нибудь знает, возможно ли это (и как это сделать), я был бы очень благодарен. Я искал это, и результаты, которые я нашел, склонны обвинять в том, что это НЕ ВОЗМОЖНО, но я нахожу это очень трудным для принятия.
Тем не менее, если вы не можете этого не сделать, но я думал, что мои приятели в StackOverflow могут дать мне окончательный ответ!
Ответы
Ответ 1
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 без необходимости самостоятельно анализировать файлы содержимого. Может ли кто-нибудь подтвердить, возможно ли это?
Изменить: Скорректированный пост в соответствии с комментарием Itay.
Ответ 2
Вот более краткий способ получить список сеансов через сохраненные файлы:
<?php
print_r(scandir(session_save_path()));
?>
Ответ 3
Это даст вам данные для всех сеансов, хранится в массиве и индексируется идентификатором сеанса:
<?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);
Ответ 4
Я использовал метод @mgroat в вызове ajax, но в заголовке ответа HTTP есть проблема, что заголовок Set-Cookie появляется несколько раз, а jQuery сообщает об ошибке:
Заголовок Set-Cookie игнорируется в ответе от URL: mysite.com/admin/ajax/main_ajax. Длина файла cookie должна быть не более 4096 символов.
Решение состоит в том, чтобы добавить header_remove("Set-Cookie")
сразу после session_start()
.