PHP: удерживание сессии

Комментарии ()

Сессия рвется потому, что веб-сервер старается держать только сессии активных пользователей. Активными, по его мнению, считаются те, которое запрашивают у него новые страницы не реже, чем указано в настройках сервера. Как правило, эта настройка записывается там, куда не имеет доступа даже арендатор сервера.

Сессия имеет свойство максмального времени жизни. Например, если мыхотим задать время жизни сесии - 3 часа. Для этого в файле php.ini устанавливаем следующие параметры:

session.gc_maxlifetime = 10800
session.cookie_lifetime = 10800

Частая ситуация, когда нету возможности внести изменения в файл php.ini. Другой способ -  установка этих параметров при помощи файла .htaccess. Для этого вносим в него следующие строки:

php_value session.gc_maxlifetime 10800
php_value session.cookie_lifetime 10800

Так же следует учесть, что хостеры часто запрещают использовать директиву php_value в файле .htaccess.

Кроме того,  установить время жизни сессионной куки из PHP можно при помощи функции session_set_cookie_params. К примеру:

<?php
    session_set_cookie_params(10800);
?>

Важно. Функциция set_cookie_params должна быть вызвана до того, как сессия будет открыта при помощи session_start.Функция set_cookie_params также позволяет установить путь, домен, настройки безопасности для сессионной куки.

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

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

Клиентская сторона

Поэтому воспользуемся обычным post-запросом с помощью jQuery

$(document).ready(function() {
var result = '';
setInterval(pinger, 300000);
});

function pinger()
{
$.post("/ajax/pinger.php", function(result) {
});
}

Каждые 5 минут (5 x 60 x 1000 = 300000 миллисекунд) будет выполняться функция pinger(), в которой и размещается наш post-запрос. Давайте немного разберем, что и как он делает.

Серверная сторона

Ну а здесь совсем просто. Запускаем сессию, выводим что-нибудь, чтобы не отдавать пустой документ:

session_start();
echo 'ok';
session_write_close();

Последняя функция не убивает сессию, а всего лишь открывает к ней доступ для других скриптов. Вся наша сессия, все данные в ней успешно остаются храниться в ней же. А вот «свежесть» сессии успешно обновляется, что нам, собственно, и нужно.

Источник

 


Webit.in.ua 2013