Уточнение коллекции мусора PHP
Из руководства PHP, session.gc_probability и состояния session.gc_divisor, что gc будет происходить на основе этой вероятности. Я понимаю.
То, что я не понимаю, заключается в том, является ли эта вероятность сеансом по сеансу или в целом.
Итак, если моя вероятность равна 1% (1/100), что GC будет происходить, означает ли это, что если один сеанс продолжает расширяться, каждый раз, когда есть 1% -ное изменение, что конкретный сеанс будет очищен? Или это означает, что 1% всех существующих сеансов (а также новых) вызовет GC для всех других существующих сеансов?
Я уверен, что это последнее, я просто хочу убедиться.
Цель этого вопроса заключается в том, что на нашем сайте я хочу, чтобы пользователи имели длительные сеансы (6 месяцев). Если 1% всех сеансов запускает GC, то это эффективно устраняет цель проведения этого долгосрочного сеанса, так как GC будет возникать каждый час или два.
Ответы
Ответ 1
Каждый раз, когда PHP script запускается и запускает сеанс, существует вероятность того, что он развернется через сеансовую папку, убив старый сеанс.
Очистка будет удалять только те сеансы, которые не были доступны в течение определенного времени. Однако PHP не гарантирует, что сессия будет уничтожена в течение этого времени.
Ваша долгосрочная стратегия сеанса должна работать нормально, но вы можете уменьшить 1% до примерно 0,1%
Еще одна вещь, которая стоит обратить внимание на то, что операционная система может очистить вашу папку /tmp во время перезагрузки, поэтому даже если PHP этого не сделает.
Ответ 2
В прошлый раз я смотрел на источник, каждый вызов которого session_start() "скатил кости", так сказать, используя делитель и вероятность. Если вы нажмете, то он удалит все файлы из каталога session.save_path
, которые были старше session.gc_maxlifetime
. Я забываю, если он использовал изменение или время доступа к файлу, хотя это не имеет значения в обычных условиях, потому что php перезаписывает файл сеанса по умолчанию в конце выполнения script, поэтому мода и время доступа должны почти всегда соответствовать очень близко.
// Rough psuedo code of how php session_start() function works regarding garbage collection.
function session_start() {
$percentChanceToGC = 100 * ini_get('session.gc_probability') / ini_get('session.session.gc_divisor');
$shouldDoGarbageCollection = rand(1, 100) < $percentChanceToGC;
if ($shouldDoGarbageCollection) {
$expiredCutoffTime = time() - ini_get('session.gc_maxlifetime');
foreach (scandir(ini_get('session.save_path')) as $sessionFile) {
if (filemtime($sessionFile) < $expiredCutoffTime) {
unlink($sessionFile);
}
}
}
// ... rest of code ....
}
Я не знаю, сколько сеансовых файлов вы собираетесь повесить, если вы хотите, чтобы они прожили как минимум 6 месяцев. Подумайте, что для php может потребоваться некоторое время, чтобы установить множество тысяч файлов, чтобы определить их возраст. Возможно, рассмотрим другие варианты долговременного хранения этих данных. Или вы можете отключить php gc и просто запустить задание cron для удаления устаревших файлов сеанса. В противном случае, 1% запросов вызовут gc и должны ждать php; другими словами, он может отставать.
Ответ 3
Я не эксперт в этом, но, прочитав руководство, я обращу ваше внимание на еще одну настройку, session.gc_maxlifetime
, Из документов:
session.gc_maxlifetime
указывает количество секунд, после которых данные будут считаться "мусором" и потенциально очищены. Сбор мусора может произойти в начале сеанса (в зависимости от session.gc_probability
и session.gc_divisor
).
Итак, если вы установите для этого параметра подходящее значение (60 * 60 * 24 * 365 / 2
в течение полугода, поэтому 15768000
), то соответствующие данные не будут иметь права на сбор мусора, независимо от того, что другие параметры.