Назад | Перейти на главную страницу

Настройка сеанса Memcache + PHP: как истекает срок действия ключей memcache?

Я провел некоторое исследование по этому поводу и не нашел окончательного ответа.

У нас есть веб-приложение, использующее обработчик сеанса PHP + Memcache.

У меня есть несколько вопросов, связанных между собой, но в конечном итоге моя проблема заключается в следующем: «Почему сеансы PHP, по-видимому, не истекают, когда мы думаем, что они должны быть?» т.е. конечный пользователь должен выйти из приложения через установленное время, но это не так.

Вот точки, пожалуйста, помогите мне соединить их и скажите, где я ошибаюсь:

Пользователи не выходят из системы.

Как я могу это отладить? Memcache не совсем прозрачен.

В качестве примера, который не работает, является сайт с тайм-аутом сеанса, установленным на два часа. Примерный пользователь будет последний раз использовать сайт ночью, а затем, через 8–10 часов, вернуться на сайт и по-прежнему оставаться в системе.

Мы тоже сталкивались с этим, но сумели вникнуть в него и точно выяснить, что происходит. Симптомы, с которыми мы столкнулись, заключались в том, что кэш памяти (с достаточно большим распределением памяти, работающим на нескольких серверах) начал вытеснять контент. Это нежелательно, так как может негативно сказаться на текущих посетителях сайта.

Наблюдая за сетевым трафиком, мы увидели следующие сообщения от PHP к Memcache:

установить memc.sess.key.abcdabcdabcdabcdabcdabcd 0 0 1823 данные ...

Это второй ноль, который вызывает проблемы - он определяет продолжительность кэширования элемента в кэше памяти. Если установить его в ноль, срок действия этого элемента в кэше памяти никогда не истечет. В вашем случае это означало, что пользователи могли вернуться через несколько часов и продолжить доступ к вашему сайту. В нашем случае кэш памяти заполнялся, что приводило к удалению нужных данных.

Я копал дальше, и все сводится к расширению PHP memcached. Начиная с версии 1.0.2 (которую мы запускаем) этот код гласит:

sess_lifetime = zend_ini_long(ZEND_STRL("session.gc_maxlifetime"), 0);
if (sess_lifetime > 0) {
    expiration = time(NULL) + sess_lifetime;
} else {
    expiration = 0;
}

В этом отрывке это ZEND_STRL("session.gc_maxlifetime") который не возвращает ожидаемое значение. Об этом сообщалось как об ошибке PHP, и исправление для библиотеки memcached описано на https://bugs.php.net/bug.php?id=59641.

Я развернул этот патч, проверил сетевой трафик и обнаружил, что он устанавливает время истечения срока действия, как ожидалось.