Доброго времени суток, уважаемые форумчане. Имеется сайт. На сайте есть авторизация. Данные пишутся в сессию. Так же имеется подключенный memcache, в который, по задумке, должна сохранятся сессия. И вот вроде бы все норм. НО при определенных обстоятельствах, к примеру при обращении к некоторым разделам сайта, в которых есть ajax скрипты (в смысле есть некоторое количество запросов с использованием ajax ) в логах memcache всплывает сообщение NOT_STORED и сессия удаляется. Привожу краткий лог. В логе после 576 sending key seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv 0 0 пробелы и удаление данных в $_SESSION. Сайт работает на OpenServer локально. Вопрос: что бы это могло быть ? Может быть кто-то сталкивался с подобным ? Какие могут быть решения ? Вот краткий лог memcache: Спойлер: Лог Код (Text): 568: Client using the ascii protocol <568 incr mmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 1 >568 NOT_FOUND <568 add mmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 768 15 1 >568 STORED <568 get mmkb68fr0l7lp8c7agcj6eoriuo8ponv >568 END <568 set mmkb68fr0l7lp8c7agcj6eoriuo8ponv 0 1567438143 0 >568 STORED <568 set mmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 768 15 1 >568 STORED <568 connection closed. ... <576 new auto-negotiating client connection 576: Client using the ascii protocol <576 incr seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 1 >576 1 <576 add seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 768 15 1 >576 NOT_STORED <576 get seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv >576 sending key seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv 0 0 >576 END <576 set seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv 0 1567438149 0 >576 STORED
Покажи код как сохраняешь. NOT_STORED говорит о том, что не удалось сохранить. Код (Text): <576 incr seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 1 >576 1 <576 add seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 768 15 1 >576 NOT_STORED Я так понимаю, что данные с таким ключем уже есть и он не сохранил их повторно.
Но почему он уничтожает сессию ? В сессии хранится ид юзера, который авторизирован. В некоторых местах для логики работы нужен ид юзера который берется из сессии. Соответственно после того как memcache не смог записать данные еще и сессия грохается и тут у меня вообще ступор, почему так
На кофейной гуще проще гадать, чем тебе помочь в данном вопросе. Без понятия, что делает твой код. Данные сессии хранишь наверное в мемкеше. Показывай, знающие может подскажут.
Полностью код приводить не вижу смысла т.к там особой сложной логики нет. В кратце: есть страница авторизации юзера. После проверки данных из формы , если такой пользователь есть и логин и пароль совпадают, пишу в супер глобальный массив $_SESSION данные: PHP: session_start(); $_SESSION['uid'] = 100500; $_SESSION['some_others_param'] = 'bla-bla-bla'; Далее есть фаил main.php, который подключается во всех исполнительных файлах. В нем проверяется наличие в массиве $_SESSION данных пользователя, в данном случае : PHP: if( !isset($_SESSION['uid]) ) { session_destroy(); header('Location: /'); exit; } Подключив memcache я рассчитывал не менять код в плане записи в сессию, а просто хранить данные в мемкеше ( грубо говоря надеясь на дефолтные настройки и что при помощи мата и какой-то там матери сессии просто будут хранится не в файле на хосте а в ОЗУ )
@voron121 PHP: <?php if ( !session_id() ) { session_start(); } $_SESSION['uid'] = 100500; $_SESSION['some_others_param'] = 'bla-bla-bla';
Но тогда проблема иного характера. Я залогинился и в $_SESSION у меня есть ид пользователя. Далее я в любом участке сайта могу получить ид пользователя и на его основе провести какие-то действия. К примеру получить данные пользователя из БД или же совершить действия иного порядка. Эта логика так же существует и в некоторых скриптах, которые реализуют фоновые процессы на сайте средствами ajax . То есть согласно вашему решению, которое приведено выше, я , в случае потери сессии, просто снова содам сессию. Но uid у меня не будет т.к его я получаю только когда пользователь успешно авторизировался на сайте . Следовательно $_SESSION['uid] не существует и проблема сохраняется Я не могу понять почему происходит потеря данных в мемкеше и как этого избежать , в случае наличия одного сервера (то есть вариант с кластером для мемкеша пока что не рассматриваю )
Там есть дестрой, потому что данный фаил не конфиг а скорее инициализирующий фаил (не суть в данном случае). В конфиге указал хранить сессию в memcache и прописал хранилище как tcp://127.0.0.1/ Если проверить коннект к мемкешу, попробовать в него чего-то записать и потом прочитать - все будет ок. Но вот с сессиями начинается что-то не совсем понятное.
Мне пока представляется такой расклад. Стартуем сессию -> грохаем сессию -> дай сессию -> где сессия!?
Тут скорее так: Стартуем сессию -> есть сессия -> есть сессия -> ... дай сессию -> где сессия ? При этом момент при котором сессия умирает не явен. Закономерности между тем когда сессия есть и когда она уже умерла я пока что не вижу. Я предполагаю что возможно (только возможно, не уверен) если в процессе работы сайта, когда сессия была объявлена, что-то в нее еще добавить, к примеру в массиве $_SESSION добавить еще параметр какой-то, то при каких-то обстоятельствах с тем же ключем что и старая сессия, новая сессия будет пытаться записаться в кеш - конфликт ключей - херим сессию. Но стендовое испытание не подтвердило моей догадки.
PHP: if ( !session_id() ) { ini_set('session.gc_maxlifetime', 3600*24*30); ini_set('session.cookie_lifetime', 3600*24*30); session_start(); }
и все равно это не решает проблемы. Так же как и с вашим предыдущим предложением, это просто пересоздаст сессию, но данные в старой сессии будут утеряны и авторизация отвалится. Вопрос не в том как пересоздать сессию, а как не потерять в ней данные при использовании memcache
Отключи мемкеш и поюзай сайт без него, чтобы убедится, что данные в сессии не затираются. В любом случае, нужно обновить до последней версии модули. Openserver у тебя локально ведь работает? На лайфе также сессии теряются ? Ты так и не показал, как ты сохраняешь в мемкеш данные. Покажи этот кусок кода. Словами объяснять не нужно.