2015-02-14 3 views
1

Я написал этот код для управления сеансами, чтобы они заканчивались, когда браузер закрыт, или если пользователь неактивен в течение определенного времени (2 часа). Однако кажется, что сеансы заканчиваются после 40 минут бездействия, и я действительно не понимаю, как это возможно. Если мой код не работает, я ожидаю, что он должен продлиться 1440 секунд (24 минуты).PHP-сессия, истекающая через 40 минут

define("MY_SESSION", "mysession"); 
define("SESSION_DURATION", 7200); 
function my_session_start() { 
    if (session_status() != PHP_SESSION_NONE) 
     return; 
    ini_set('session.gc_maxlifetime', SESSION_DURATION); 
    ini_set('session.cookie_lifetime', 0); 
    session_set_cookie_params(0); 
    session_name(MY_SESSION); 
    session_start(); 
    if ((!isset($_SESSION['EXPIRES'])) || ($_SESSION['EXPIRES'] < time())) { 
     $_SESSION = array(); 
     session_unset(); 
     session_destroy(); 
     session_start(); 
    } 
    $_SESSION['EXPIRES'] = time() + SESSION_DURATION; 
    if (isset($_SESSION['REGENERATE'])) { 
     $_SESSION['REGENERATE']++; 
     if ($_SESSION['REGENERATE'] >= mt_rand(90,100)) { 
      $_SESSION['REGENERATE'] = 0; 
      session_regenerate_id(true); 
     } 
    } 
    else { 
     $_SESSION['REGENERATE'] = 0; 
     session_regenerate_id(true); 
    } 
} 

Я поместил my_session_start() в каждый файл PHP. Я на общем сервере, но ini_set() не заблокирован, и, запустив phpinfo() после my_session_start(), я вижу, что локальное значение session.gc_maxlifetime установлено на 7200 (тогда как главное значение равно 1440). session.gc_probability и session.gc_divisor оставлены по умолчанию (соответственно 1 и 100). Я также регенерирую идентификаторы сеансов на случайной основе из 90-100 загрузок страниц/звонков AJAX, но это не имеет значения, так как я попытался также прокомментировать эту часть, и это не решило проблему.

Итак, я что-то не так с моим кодом? Откуда берутся эти минуты, я имею в виду, почему 40 минут?

+1

Проверьте этот ответ на [как истекает PHP сессии после 30m] [1]. [1]: http://stackoverflow.com/questions/520237/how-do-i-expire-a-php-session-after-30-minutes – Alberto

+0

Это почти то, что я делаю с мой код и проблема, безусловно, не связаны с делителем и вероятностью, так как я пытался как минимум 5 раз: 39 минут бездействия -> сеанс живой, 41 минута бездействия -> мертвая сессия. Все еще интересно, почему и почему 40 минут – Fabius

ответ

1

Итак, я наконец выяснил, как исправить эту проблему. Решение было изменить сеансовые файлы сохранения папки:

ini_set('session.save_path', "/the/new/path/to/sessions/"); //DEFAULT: /var/lib/php5 

Делая это означает, что сессия файлы могут быть просмотрены, поэтому я добавил файл .htaccess, содержащий:

deny from all 

внутри «//new/path/to/sessions/". Поэтому ничего не видно из-за пределов сервера.

Кроме того, я должен был добавить новую функцию сбора мусора сессии:

function clear_old_sessions() { 
    $folder = "/the/new/path/to/sessions/"; 
    $files = scandir($folder); 
    for ($i = 0; $i < count($files); $i++) { 
     $file = $folder . $files[$i]; 
     if (is_file($file)) 
      if (substr($files[$i], 0, 5) == "sess_") 
       if ((filemtime($file) + SESSION_DURATION) < time()) // SESSION_DURATION previosuly defined as 7200 (seconds) 
          unlink($file); 
    } 
} 
Смежные вопросы