Подтвердить что ты не робот

Уточнение коллекции мусора PHP

Из руководства PHP, session.gc_probability и состояния session.gc_divisor, что gc будет происходить на основе этой вероятности. Я понимаю.

То, что я не понимаю, заключается в том, является ли эта вероятность сеансом по сеансу или в целом.

Итак, если моя вероятность равна 1% (1/100), что GC будет происходить, означает ли это, что если один сеанс продолжает расширяться, каждый раз, когда есть 1% -ное изменение, что конкретный сеанс будет очищен? Или это означает, что 1% всех существующих сеансов (а также новых) вызовет GC для всех других существующих сеансов?

Я уверен, что это последнее, я просто хочу убедиться.

Цель этого вопроса заключается в том, что на нашем сайте я хочу, чтобы пользователи имели длительные сеансы (6 месяцев). Если 1% всех сеансов запускает GC, то это эффективно устраняет цель проведения этого долгосрочного сеанса, так как GC будет возникать каждый час или два.

4b9b3361

Ответ 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), то соответствующие данные не будут иметь права на сбор мусора, независимо от того, что другие параметры.