Как установить время жизни сеанса
Как установить время жизни сеанса в PHP? Я хочу установить его навсегда, пока запрос существует. Запрос - AJAX. Мой PHP-код, обрабатывающий запрос AJAX:
// AJAX.php
<?php
session_start();
$_SESSION['counter'] = $_SESSION['counter'] + 1;
header('Content-type: application/json');
echo json_encode(array('tick' => $_SESSION['counter']));
?>
и JavaScript:
$(document).ready(function() {
function check() {
getJSON('ajax.php');
}
function getJSON(url) {
return $.getJSON(
url,
function(data) {
$("#ticker").html(data.tick);
}
);
}
setInterval(function() {
check();
}, 10000); // Tick every 10 seconds
});
Сессия всегда сбрасывается через 300 секунд.
Ответы
Ответ 1
Сессии на PHP работают с сеансом типа Cookie, а на стороне сервера информация о сеансе постоянно удаляется.
Чтобы установить время жизни в php, вы можете использовать функцию session_set_cookie_params перед session_start:
session_set_cookie_params(3600,"/");
session_start();
Например, 3600 секунд составляет один час, в течение 2 часов 3600 * 2 = 7200.
Но это сеансовый cookie, браузер может истечь сам, если вы хотите сохранить большие сеансы (например, запомнить логин), вам нужно сохранить данные на сервере и стандартный файл cookie на стороне клиента.
У вас может быть таблица "Сессии":
- session_id int
- session_hash varchar (20)
- текст session_datali >
И проверяя Cookie, вы сохраняете "идентификатор сеанса" и "хэш" (для обеспечения безопасности) на стороне клиента, и вы можете сохранить данные сеанса на стороне сервера, например:
При входе в систему:
setcookie('sessid', $sessionid, 604800); // One week or seven days
setcookie('sesshash', $sessionhash, 604800); // One week or seven days
// And save the session data:
saveSessionData($sessionid, $sessionhash, serialize($_SESSION)); // saveSessionData is your function
Если пользователь возвращает:
if (isset($_COOKIE['sessid'])) {
if (valide_session($_COOKIE['sessid'], $_COOKIE['sesshash'])) {
$_SESSION = unserialize(get_session_data($_COOKIE['sessid']));
} else {
// Dont validate the hash, possible session falsification
}
}
Очевидно, сохраните все сеансы/файлы cookie перед отправкой данных.
Ответ 2
Задайте следующие параметры php для того же значения в секундах:
session.cookie_lifetime
session.gc_maxlifetime
в php.ini,.htaccess или, например, с помощью
ini_set('session.cookie_lifetime', 86400);
ini_set('session.gc_maxlifetime', 86400);
в течение дня.
Ссылки:
http://www.php.net/manual/en/session.configuration.php
http://www.php.net/manual/en/function.ini-set.php
Ответ 3
До PHP 7 функция session_start() напрямую не принимала какие-либо параметры конфигурации. Теперь вы можете сделать это таким образом
<?php
// This sends a persistent cookie that lasts a day.
session_start([
'cookie_lifetime' => 86400,
]);
?>
Ссылка: https://php.net/manual/en/function.session-start.php#example-5976
Ответ 4
Сессии можно настроить в файле php.ini или в файле .htaccess. Посмотрите документацию по сеансу PHP.
В основном вы хотите найти строку session.cookie_lifetime
в php.ini и сделать ее равной 0, чтобы файл cookie сессии был действителен до закрытия браузера. Если вы не можете отредактировать этот файл, вы можете добавить php_value session.cookie_lifetime 0
в ваш .htaccess файл.
Ответ 5
Поскольку большинство сеансов хранятся в COOKIE (согласно приведенным выше комментариям и решениям), важно убедиться, что COOKIE помечен как SECURE (передний С#):
myHttpOnlyCookie.HttpOnly = true;
и/или vie php.ini (по умолчанию TRUE, начиная с php 5.3):
session.cookie_httponly = True
Ответ 6
Пока Пользователь не удаляет свои файлы cookie или не закрывает свой браузер, сеанс должен оставаться в силе.