2015-06-01 3 views
0

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

Сессии хранят различную информацию, включая строку входа и идентификатор пользователя, которые используются для аутентификации. Если аутентификация не удалась, пользователь перенаправляется на страницу входа в систему.

Я выполнил несколько проверок, чтобы узнать, что происходит;

Я проверяю, чтобы сессия была начата с session_status. Это происходит как активный сеанс.

Я также пытаюсь вывести переменные сеанса, но они возвращаются как не заданные.

Я также сравниваю идентификатор сеанса и отличается от предыдущего.

У меня нет полного доступа ко всем конфигурациям PHP, но я знаю, что сеанс истекает через 5 часов, но сеансы становятся разрушаемыми гораздо чаще, иногда в течение нескольких минут.

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

Мы используем пользовательскую функцию сеанса и каждый раз регенерируем сеанс (отключение этого не позволяет устранить проблему). Функция:

function sec_session_start() { 
    $session_name = 'sec_session_id'; // Set a custom session name 
    $secure = SECURE; 
    // This stops JavaScript being able to access the session id. 
    $httponly = true; 
    // Forces sessions to only use cookies. 
    if (ini_set('session.use_only_cookies', 1) === FALSE) { 
     header("Location: ../error.php?err=Could not initiate a safe session (ini_set)"); 
     exit(); 
    } 
    // Gets current cookies params. 
    $cookieParams = session_get_cookie_params(); 
    session_set_cookie_params($cookieParams["lifetime"], 
     $cookieParams["path"], 
     $cookieParams["domain"], 
     $secure, 
     $httponly); 
    // Sets the session name to the one set above. 
    session_name($session_name); 
    session_start();   // Start the PHP session 
    session_regenerate_id(); // regenerated the session, delete the old one. 
} 
+1

ID другой сессии - новые сессии. старые там, но заброшенные/осиротевшие. это означает, что вы получаете свежий/чистый/пустой $ _SESSION. вам необходимо проверить настройки cookie и убедиться, что они совместимы на всех страницах, использующих сеанс. –

+0

@MarcB Это правда, если подумать об этом, мы обновляем сеанс на каждой странице. Однако отключение этого не решило проблему. Я обновляю свой вопрос с помощью нашей функции сессии. – sharf

+0

ах. если вы обновляетесь, это объясняет изменение идентификаторов. –

ответ

0

Проверьте истечение срока действия вашей сессии. По умолчанию сеансы php on-disk не очищаются при каждом запуске php-скрипта (см. http://php.net/manual/en/session.configuration.php#ini.session.gc-probability), поэтому на сайтах с низким объемом очень важно, чтобы сеансы, которые должны были, истекли, чтобы считаться действительными, в то время как на занятых сайтах это менее вероятно, так как есть больше шансов для запуска сборщика мусора сессии.

+0

Как это применимо к моей проблеме? – sharf

+0

В вашем вопросе конкретно говорится, что это происходит при высоком трафике. Если ваша среда php настроена для запуска сеанса GC 1: 100 (1%) во время небольших сеансов трафика не будет очищаться так быстро, как только они истекли, как они будут во время высокого трафика. – Stephen

+0

Высоким трафиком я имею в виду одного из 10 человек, открывающих 4-5 страниц одновременно. Но если это активный сеанс, почему он должен быть удален сборкой мусора? – sharf

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