В какой момент доступны данные сеанса?

#php #session

#php #сеанс

Вопрос:

На данный момент у меня есть следующее открытие сеанса (php),

 session_start() ;

foreach($_SESSION as $key => $value){
    $alert .= '<br/>' . '['.$key.']='.$value ;
}

$alert .= '<br/>$_SERVER[MY_SERVER...]='.$_SERVER['MY_SERVER_GENERATED'] ;

if($_SESSION['MY_SERVER_GENERATED'] !== true ||
    $_SERVER['REMOTE_ADDR'] !== $_SESSION['PREV_REMOTEADDR'] ||
    $_SERVER['HTTP_USER_AGENT'] !== $_SESSION['PREV_USERAGENT']){
        $alert .= 'session destroyed' ;
        session_destroy() ;
}

if(isset($_SESSION['CREATED']) amp;amp; (strtotime('now') - $_SESSION['CREATED']) > 300){//Delete expired sessions - seconds
    $alert .= '<div class="error_box">Your session has expired!</div>' ;
    $_SESSION = array() ;
}

session_regenerate_id();
$_SESSION['CREATED'] = strtotime('now') ;
$_SESSION['MY_SERVER_GENERATED'] = true ;
$_SESSION['PREV_USERAGENT'] = $_SERVER['HTTP_USER_AGENT'] ;
$_SESSION['PREV_REMOTEADDR'] = $_SERVER['REMOTE_ADDR'] ;

echo $alert ;
  

Проблема в том, что сеанс каждый раз уничтожается. $_SESSION просто пуст. В какой момент доступно выполнение проверок, подобных описанным выше?

Ой, забыл указать, что я подтвердил, что сеанс хранит данные, но не до тех пор, пока страница не будет запущена. Итак, сеанс уничтожается, потому что все данные $ _SESSION равны нулю, и поэтому условия оцениваются как false. В качестве примера $alert не регистрируется как имеющий что-либо сохраненное в нем.

Комментарии:

1. попробуйте проверить session_lifetime в вашем php.ini

Ответ №1:

Похоже, в вашем коде есть уловка 22:

 session_start() ;


if(!$_SESSION['MY_SERVER_GENERATED']){ <------- this will always be true 
                                                for a fresh session, so
    session_destroy() ;  <--------------------- this will always be executed
  

у ваших данных сеанса никогда не будет возможности заполнить.

Комментарии:

1. @Magic условие будет соответствовать, если переменная имеет значение false или если она вообще не задана, что сначала всегда будет иметь значение true. Если вы хотите проверить его на наличие значения false и ничего другого, выполните if ($_SESSION['MY_SERVER_GENERATED'] !== false)

2. Я обновляю код, чтобы показать именно то, что у меня есть в настоящее время. Все необходимые для этого переменные $ _SESSION устанавливаются для него после regenerate_id, но $_SESSION по-прежнему отображается пустым при каждом запуске кода. Есть ли определенный момент, когда данные $ _SESSION становятся доступными?

3. @Magic насколько я могу видеть, вы все еще, кажется, уничтожаете сеанс до того, как будут установлены значения, что приводит к тому, что значения нигде не устанавливаются. В первом запросе ваше первое if условие всегда будет оцениваться как true

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