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

сеанс memcache и memcached не сохраняется

поэтому у меня проблема с сеансами, сохраняющимися в приложении, которое использует драйвер memcached php, в то время как другое существующее приложение использует драйвер memcache.

На сервере я вижу оба установлены

Я также вижу в конфигурации php, что зарегистрированные обработчики сохранения включают как memcache, так и memcached, однако для параметра конфигурации php "session.save_handler" установлено значение memcache.

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

Я знаю, что демон memcached и соединение работают, так как я успешно сохраняю в нем кеш, используя драйвер memcached.

Как мне когда-либо устранить эту проблему, могут ли она обнаруживать ошибки или журналы где-нибудь?

Проверьте настройку session.gc_maxlifetime. Все, что больше 60 * 60 * 24 * 30, приведет к истечению срока действия вашего сеансового ключа в кэше памяти сразу после того, как PHP сохранит его.

Протокол Memcache указывает, что любое число больше 60 * 60 * 24 * 30 будет рассматриваться как абсолютное время unix, а не как смещение от текущего времени:

Некоторые команды включают отправку клиентом некоторого времени истечения срока действия (относительно элемента или операции, запрошенной клиентом) на сервер. Во всех таких случаях фактическое отправленное значение может быть либо временем Unix (количество секунд с 1 января 1970 года, как 32-битное значение), либо количеством секунд, начиная с текущего времени. В последнем случае это количество секунд не может превышать 60 * 60 * 24 * 30 (количество секунд за 30 дней); если число, отправленное клиентом, больше этого, сервер будет считать его реальным значением времени Unix, а не смещением от текущего времени.

(Видеть https://github.com/memcached/memcached/blob/e31a591210311d0658a90a86f71563fa6d7b095c/doc/protocol.txt#L79)

Обработчик сеанса PHP просто использует session.gc_maxlifetime в качестве времени истечения срока действия ключа сеанса, не внося в него никаких изменений.

Подробности по адресу: http://rcmachado.github.io/php/memcache/2014/07/23/php-memcached-gotchas.html (раскрытие: я написал сообщение).