За последние 24 часа нас посетили 21874 программиста и 1073 робота. Сейчас ищут 667 программистов ...

Memcache - NOT_STORED и удаляет сессию

Тема в разделе "Прочие вопросы по PHP", создана пользователем voron121, 26 авг 2019.

Метки:
  1. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    Доброго времени суток, уважаемые форумчане. Имеется сайт. На сайте есть авторизация. Данные пишутся в сессию. Так же имеется подключенный memcache, в который, по задумке, должна сохранятся сессия. И вот вроде бы все норм. НО при определенных обстоятельствах, к примеру при обращении к некоторым разделам сайта, в которых есть ajax скрипты (в смысле есть некоторое количество запросов с использованием ajax ) в логах memcache всплывает сообщение NOT_STORED и сессия удаляется.
    Привожу краткий лог. В логе после
    576 sending key seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv
    0 0 пробелы и удаление данных в $_SESSION.

    Сайт работает на OpenServer локально.

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

    Вот краткий лог memcache:
    Код (Text):
    1. 568: Client using the ascii protocol
    2. <568 incr mmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 1
    3. >568 NOT_FOUND
    4. <568 add mmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 768 15 1
    5. >568 STORED
    6. <568 get mmkb68fr0l7lp8c7agcj6eoriuo8ponv
    7. >568 END
    8. <568 set mmkb68fr0l7lp8c7agcj6eoriuo8ponv 0 1567438143 0
    9. >568 STORED
    10. <568 set mmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 768 15 1
    11. >568 STORED
    12. <568 connection closed.
    13. ...
    14.  
    15. <576 new auto-negotiating client connection
    16. 576: Client using the ascii protocol
    17. <576 incr seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 1
    18. >576 1
    19. <576 add seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 768 15 1
    20. >576 NOT_STORED
    21. <576 get seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv
    22. >576 sending key seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv
    23. 0 0
    24.  
    25.  
    26. >576 END
    27. <576 set seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv 0 1567438149 0
    28. >576 STORED

     
  2. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Покажи код как сохраняешь.
    NOT_STORED говорит о том, что не удалось сохранить.

    Код (Text):
    1. <576 incr seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 1
    2. >576 1
    3. <576 add seodroid.locmmkb68fr0l7lp8c7agcj6eoriuo8ponv.lock 768 15 1
    4. >576 NOT_STORED
    Я так понимаю, что данные с таким ключем уже есть и он не сохранил их повторно.
     
  3. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    Но почему он уничтожает сессию ? В сессии хранится ид юзера, который авторизирован. В некоторых местах для логики работы нужен ид юзера который берется из сессии. Соответственно после того как memcache не смог записать данные еще и сессия грохается и тут у меня вообще ступор, почему так
     
  4. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    На кофейной гуще проще гадать, чем тебе помочь в данном вопросе.
    Без понятия, что делает твой код.

    Данные сессии хранишь наверное в мемкеше. Показывай, знающие может подскажут.
     
  5. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    Полностью код приводить не вижу смысла т.к там особой сложной логики нет. В кратце:

    есть страница авторизации юзера. После проверки данных из формы , если такой пользователь есть и логин и пароль совпадают, пишу в супер глобальный массив $_SESSION данные:

    PHP:
    1. $_SESSION['uid'] = 100500;
    2. $_SESSION['some_others_param'] = 'bla-bla-bla';
    Далее есть фаил main.php, который подключается во всех исполнительных файлах. В нем проверяется наличие в массиве $_SESSION данных пользователя, в данном случае :

    PHP:
    1. if( !isset($_SESSION['uid]) ) {
    2.            session_destroy();
    3.            header('Location: /');
    4.            exit;
    5. }
    Подключив memcache я рассчитывал не менять код в плане записи в сессию, а просто хранить данные в мемкеше ( грубо говоря надеясь на дефолтные настройки и что при помощи мата и какой-то там матери сессии просто будут хранится не в файле на хосте а в ОЗУ )
     
  6. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    voron121 нравится это.
  7. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    Но тогда проблема иного характера. Я залогинился и в $_SESSION у меня есть ид пользователя. Далее я в любом участке сайта могу получить ид пользователя и на его основе провести какие-то действия. К примеру получить данные пользователя из БД или же совершить действия иного порядка. Эта логика так же существует и в некоторых скриптах, которые реализуют фоновые процессы на сайте средствами ajax . То есть согласно вашему решению, которое приведено выше, я , в случае потери сессии, просто снова содам сессию. Но uid у меня не будет т.к его я получаю только когда пользователь успешно авторизировался на сайте . Следовательно $_SESSION['uid] не существует и проблема сохраняется :(

    Я не могу понять почему происходит потеря данных в мемкеше и как этого избежать , в случае наличия одного сервера (то есть вариант с кластером для мемкеша пока что не рассматриваю )
     
  8. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    И там есть дестрой -_- в конфиге пыхи указал хранить сессии в озу?
     
  9. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    Там есть дестрой, потому что данный фаил не конфиг а скорее инициализирующий фаил (не суть в данном случае). В конфиге указал хранить сессию в memcache и прописал хранилище как tcp://127.0.0.1/

    Если проверить коннект к мемкешу, попробовать в него чего-то записать и потом прочитать - все будет ок. Но вот с сессиями начинается что-то не совсем понятное.
     
  10. villiwalla

    villiwalla Активный пользователь

    С нами с:
    14 дек 2016
    Сообщения:
    471
    Симпатии:
    70
    Мне пока представляется такой расклад. Стартуем сессию -> грохаем сессию -> дай сессию -> где сессия!?
     
  11. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    Тут скорее так: Стартуем сессию -> есть сессия -> есть сессия -> ... дай сессию -> где сессия ? При этом момент при котором сессия умирает не явен. Закономерности между тем когда сессия есть и когда она уже умерла я пока что не вижу.

    Я предполагаю что возможно (только возможно, не уверен) если в процессе работы сайта, когда сессия была объявлена, что-то в нее еще добавить, к примеру в массиве $_SESSION добавить еще параметр какой-то, то при каких-то обстоятельствах с тем же ключем что и старая сессия, новая сессия будет пытаться записаться в кеш - конфликт ключей - херим сессию. Но стендовое испытание не подтвердило моей догадки. :(
     
  12. Artur_hopf

    Artur_hopf Активный пользователь

    С нами с:
    7 май 2018
    Сообщения:
    2.266
    Симпатии:
    405
    PHP:
    1. if ( !session_id() )
    2.     {
    3.         ini_set('session.gc_maxlifetime', 3600*24*30);
    4.         ini_set('session.cookie_lifetime', 3600*24*30);
    5.         session_start();
    6.     }
     
  13. voron121

    voron121 Активный пользователь

    С нами с:
    18 ноя 2016
    Сообщения:
    29
    Симпатии:
    1
    и все равно это не решает проблемы. Так же как и с вашим предыдущим предложением, это просто пересоздаст сессию, но данные в старой сессии будут утеряны и авторизация отвалится. Вопрос не в том как пересоздать сессию, а как не потерять в ней данные при использовании memcache
     
  14. lastdays

    lastdays Активный пользователь

    С нами с:
    27 сен 2012
    Сообщения:
    410
    Симпатии:
    74
    Отключи мемкеш и поюзай сайт без него, чтобы убедится, что данные в сессии не затираются.
    В любом случае, нужно обновить до последней версии модули. Openserver у тебя локально ведь работает? На лайфе также сессии теряются ?

    Ты так и не показал, как ты сохраняешь в мемкеш данные. Покажи этот кусок кода. Словами объяснять не нужно.