vstest.console.exe зависает после первого теста при запуске из TFS Build

Вы должны реализовать собственный тайм-аут сеанса. Оба варианта, упомянутые другими ( session.gc_maxlifetime и session.cookie_lifetime ), ненадежны. Я объясню причины этого.

Сначала:

session.gc_maxlifetime session.gc_maxlifetime указывает количество секунд, после которых данные будут быть замеченным как «мусор» и очищен. Сбор мусора происходит во время начала сеанса.

Но сборщик мусора запускается только с вероятностью session.gc_probability , деленной на session.gc_divisor . И используя значения по умолчанию для этих параметров (1 и 100 соответственно), вероятность составляет всего 1%.

Ну, вы можете просто настроить эти значения, чтобы сборщик мусора запускался чаще. Но когда запускается сборщик мусора, он проверяет действительность для каждого зарегистрированного сеанса. И это дорого стоит.

Кроме того, при использовании файлов PHP по умолчанию session.save_handler данные сеанса хранятся в файлах по пути, указанному в session.save_path . С этим обработчиком сеанса возраст данных сеанса вычисляется на дату последней модификации файла, а не на последнюю дату доступа:

Примечание. Если вы используете обработчик сеанса по умолчанию, основанный на файлах, ваша файловая система должна отслеживать время доступа (atime). Windows FAT не так, вам придется придумать другой способ обработки мусора, собирающего вашу сессию, если вы застряли в файловой системе FAT или в любой другой файловой системе, где отслеживание атима недоступно. Начиная с PHP 4.2.3 он использовал mtime (измененная дата) вместо atime. Таким образом, у вас не будет проблем с файловыми системами, где отслеживание атима недоступно.

Таким образом, возможно, что файл данных сеанса удаляется, а сам сеанс по-прежнему считается действительным, поскольку

[blockquote>

session.cookie_lifetime session.cookie_lifetime указывает время жизни файла cookie в секундах, которое отправляется в браузер. [...]

Да, это так. Это влияет только на время жизни файла cookie, и сам сеанс может быть действительным. Но задача сервера - аннулировать сеанс, а не клиент. Так что это ничего не помогает. Фактически, если session.cookie_lifetime установлен на 0, сделайте cookie сеанса реальным сеансовым cookie , который действителен только до закрытия браузера.

Заключение / лучшее решение:

Лучшее решение - реализовать собственный тайм-аут сеанса. Используйте простую метку времени, которая обозначает время последнего действия (т. Е. Запрос) и обновляет его с каждым запросом:

if (isset($_SESSION['LAST_ACTIVITY']) && (time() - $_SESSION['LAST_ACTIVITY'] > 1800)) {
    // last request was more than 30 minutes ago
    session_unset();     // unset $_SESSION variable for the run-time 
    session_destroy();   // destroy session data in storage
}
$_SESSION['LAST_ACTIVITY'] = time(); // update last activity time stamp

Обновление данных сеанса с каждым запросом также изменяет дату изменения файла сеанса, так что сеанс не удаляется сборщиком мусора преждевременно.

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

if (!isset($_SESSION['CREATED'])) {
    $_SESSION['CREATED'] = time();
} else if (time() - $_SESSION['CREATED'] > 1800) {
    // session started more than 30 minutes ago
    session_regenerate_id(true);    // change session ID for the current session and invalidate old session ID
    $_SESSION['CREATED'] = time();  // update creation time
}

Примечания:

  • session.gc_maxlifetime должно быть как минимум равно времени жизни этого пользовательского обработчика истечения (1800 в этом примере);
  • если вы хотите закончить сеанс после 30 минут активности вместо 30 минут с начала , вам также нужно будет использовать setcookie с истечением срока действия time()+60*30 ], чтобы сохранить файл cookie сессии.

0
задан Kapil Verma 28 February 2019 в 05:55
поделиться