session_status () не возвращает ничего при перезагрузке

Я уже видел это идентичный < strong> противоположный вопрос и его пример кода OP кажутся мне совершенно нормальными. Я также читал (включая документацию по PHP), что сеанс можно проверить с помощью session_status() на PHP ›= 5.4, и это должно быть хорошо, прежде чем вызывать session_start(), чтобы определить, существует ли он уже.

Теперь я использую PHP 5.4.16 на машине CentOS 7.10, и session_status() всегда возвращает 1 (PHP_SESSION_NONE) для меня, только когда я перезагружаю страницу с помощью этого примера:

<?php
$status = session_status();
session_start();
echo "The session status is : $status";

Я ожидаю, что он вернет PHP_SESSION_ACTIVE (2), когда я перезагружаю страницу (и я не выполняю принудительную перезагрузку с очисткой кеша). Я использую последнюю версию Chrome, и страница встроена в виртуальный хост с HTTPS через порт 8443.

Я проверил версию PHP как с php --version, так и с помощью phpinfo() скрипта, чтобы на всякий случай исключить конфликт версий, и они такие же. Кроме того, когда я посещаю страницу сценария сеанса, сервер создает пустые файлы в каталоге /var/lib/php/session. Я не менял настройки PHP по умолчанию для сеанса или чего-то еще.

Чтобы прояснить: session_status() работает нормально, если впоследствии проверяется при выполнении того же сценария (The session status is : 2), но, естественно, меня это не интересует, поскольку я хочу сначала проверить, существует ли сеанс.

Что могло быть не так?


person Adrián    schedule 13.10.2020    source источник
comment
Так ты говоришь, когда перезагружаешь сессию, теряется ??   -  person Paul Baiju    schedule 13.10.2020
comment
Опасность: PHP 5.4 не поддерживался и не получал обновлений безопасности более полувека. 5.4.16 от мая 2013 г. и содержит уязвимости. Обновите его как можно скорее!   -  person Quentin    schedule 13.10.2020
comment
PHP_SESSION_NONE if sessions are enabled, but none exists. из документации означает, что я могу ошибаться, что ваша конфигурация разрешила сеанс, поэтому вы не получаете 0 (PHP_SESSION_DISABLED), но ваш сеанс еще не запущен. В результате вы получите PHP_SESSION_NONE.   -  person Frankich    schedule 13.10.2020
comment
Получение статуса перед началом сеанса. Почему в этот момент это должно быть что-нибудь, но ничего? Эта функция дает вам текущий статус текущего запроса.   -  person Magnus Eriksson    schedule 13.10.2020


Ответы (2)


Ваш session_status всегда будет PHP_SESSION_NONE, пока вы не вызовете session_start во время жизни текущего запроса. Не имеет значения, если по какому-либо предыдущему запросу вы уже начали сеанс: вам нужно перезапустить его, чтобы возобновить ранее запущенный сеанс. Это делается с помощью файлов cookie.

Если вы намерены начать сеанс только в том случае, если пользователь уже сделал что-то в прошлом, что запустило сеанс (например, они уже вошли в систему ранее), и вы хотите возобновить сеанс, но не начинать новый, тогда вы можете просто проверить if (isset($_COOKIE['PHPSESSID'])).

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

person Palantir    schedule 13.10.2020
comment
Спасибо, вот и все. Основная проблема в том, что я предполагал, что предыдущие сеансы доступны сразу после перезагрузки страницы. Я не считаю обратное очевидным. - person Adrián; 13.10.2020

По моему опыту, session_status () позволяет вам узнать, был ли запущен сеанс, поэтому если session_start () был вызван в текущем скрипте.

  • PHP_SESSION_DISABLED Я думаю, что это возвращается, если сеанс отключен в конфигурации PHP.
  • PHP_SESSION_NONE возвращается, если сеанс не был запущен в текущем скрипте
  • PHP_SESSION_ACTIVE, если сеанс был запущен в текущем скрипте.

Это сообщение может вас заинтересовать https://stackoverflow.com/questions/32356373/how-to-disable-session-in-php#:%7E:text=You%20can%20disable%20the%20session,ini%20.

Способ проверить, был ли запущен сеанс в другом сценарии, будет


<?php

session_start();

if (!isset($_SESSION['init'])) {
   echo 'first time session';
   $_SESSION['init'] = true;
}


person ypio    schedule 13.10.2020