2012-02-24 3 views
0

Я не могу заставить свою сессию отключиться. см. Ниже очень простой код. Кнопка запуска запускает сеанс, а ниже - идентификатор печати и время до таймаута. Я установил его на 5 секунд, который он отображает, но если вы ждете более 5 секунд и обновляете его, он покажет идентификатор и 5 секунд. Я что-то упустил?Сессия PHP не синхронизирована

<?php 

echo <<<_END 

<form method="post" action=""> 
<input type="hidden" name="start" value="yes"/> 
<input type="submit" value="Start session"/> 
</form> 
_END; 

if (isset($_POST['start'])) 
{ 
session_start(); 
ini_set('session.gc_maxlifetime', 5); 
ini_set('gc_probability', 100); 
ini_set('gc_divisor', 100); 
} 

echo session_id(); 
echo "<br>"; 
echo ini_get('session.gc_maxlifetime'); 

?> 
+0

Этот идентификатор сеанса - это установленный файл cookie, и отброшенный сеанс будет перезапущен с тем же идентификатором, если ваш браузер по-прежнему отправляет файл cookie. Попробуйте _store_ что-то в '$ _SESSION', и посмотрите, все ли он там. Кроме того, выполните 'ini_set'' before_ 'session_start'. – Wrikken

ответ

1

От the php documentation:

To use cookie-based sessions, session_start() must be called before outputing anything to the browser..

+0

Да. Должно быть вызвано на каждой странице, в которой вы хотите использовать переменные сеанса тоже, поэтому включение в оператор 'if' не будет работать здесь. – ceejayoz

0

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

(по умолчанию сессии удалить, хрон. Может ли запустить операцию удаления?)

+0

Насколько мне известно, старые файлы сеансов не удаляются cron, а фактически 'session_start()'. На каждом 'session_start()' существует низкая вероятность того, что и сборщик мусора сессии будет вызываться и удалять старые файлы сеанса. OP даже настроил поведение GC с 'ini_set ('gc_probability', 100); ini_set ('gc_divisor', 100); '. – Basti

+0

Я также не смог найти источник вашего утверждения о том, что слишком короткое 'session_maxlifetime' может вызвать проблемы. Можете ли вы предоставить нам источник, пожалуйста? – Basti

0

ini_set просто изменить настройки для текущей страницы. Попробуйте поместить код ниже if, в верхней части страницы, и вам нужно позвонить session_start каждый раз, когда вы занимаетесь сессией.

<?php 

ini_set('session.gc_maxlifetime', 5); 
ini_set('gc_probability', 100); 
ini_set('gc_divisor', 100); 
session_start(); 

echo <<<_END 
<form method="post" action=""> 
<input type="hidden" name="start" value="yes"/> 
<input type="submit" value="Start session"/> 
</form> 
_END; 

if (isset($_POST['start'])) 
{ 
    $_SESSION['test'] = 'I should disappear on next request after 5 seconds'; 
} 

echo $_SESSION['test']; 

?> 
Смежные вопросы