Добрый день! Задаюсь вопросом как дождаться записи результата в сессию и только потом выполнять какие-то действия. Сессия у меня хранится в редисе. И проблема в том что запись происходит не моментально, а все-таки через какое-то время. И последующий код напросто не возьмет значения сессии поскольку она ещё не записалась. Как можно сделать менее кривой вариант, для отлова записи, callback. В самих доках не нашел подобного.
Ты, видимо, не понимаешь, что фасад сам по себе ничего не делает и нет никакой разницы, как писать данные в сессию, через DI, фасад или app('session').
Troodi Larson, я понимаю, что можно заставить PHP работать асинхронно, но то что ты рассказываешь, явно не подразумевает асинхронности. Так откуда ты берешь асинхронность? Может ты просто не сохранял сессию или не перезагружал модель?
Николай, Я тоже со вчерашего дня изучал этот вопрос. И пришёл к выводу, что от функции идет запрос к redis, а уже он он может не моментально записать. Иначе, я не могу предположить почему session helper отдает страницу быстрее, чем Session фасад. Даже засекая время работы оно отличается, и вряд ли из-за того что один хелпер, а другой фасад.
Так откуда ты берешь асинхронность? Может ты просто не сохранял сессию или не перезагружал модель?
Если я просто сохраняю хелпером, то мне надо было ставить sleep() чтобы потом обработать результат. Прям моментально не получалось вынуть значение ключа.
Troodi Larson, без кода не понять. Но асинхронности там быть не может. Можно вообще забыть про редис, это всего лишь хранилище. Когда ты сохраняешь в сессию, и ниже по коду обращаешься к сессии, никакого чтения из редиса не происходит. В приведенном выше коде, ты напрямую делаешь save. Может ты пробуешь не из объекта ларавельской сессии читать, а напрямую из редиса? Конечно, в редисе еще ничего не будет. Т.к. сэйв в хранилище происходит позже.
JhaoDa, Если я правильно понимаю, то сначала возвращается сессия респонсом, а только потом можно её использовать в следующем запросе. Но в таком случае как это вообще у меня сейчас это может работать?
Troodi Larson, не понять ничего из твоих объяснений. Это в рамках одного запроса или нет? Зацепись за метод save() и отдебаж его вызовы, может тогда поймешь, где ты прерываешь нормальный ход событий. Если это разные запросы, то, возможно ты прерываешь скрипт до записи в хранилище сессии или еще что-то.
JhaoDa, Я вижу, что перед $response = $next($request); берутся куки, запускается если нет сессия, а потом уже сессия сохраняется и пишется в куки идентификатор. То есть по логике вещей в данном случае:
JhaoDa, Я уже понял, что фасады и хелперы не имеют разницы. Но вот разница в том что я не использовал в хелпере метод ->save()
Но теперь я запутался настолько, что уже не уверен, что такой код будет работать:
JhaoDa, Я преблагодарен за помощь. Вроде бы такая глупость, а логика вся нарушилась. Я честно говоря сам теперь удивляюсь, почему я так делал. Самое удивительное, что я не увидел метода save() в документации в разделе "Session", поскольку там пример с $request.
Troodi Larson, метода save нет в документации, потому что не надо вызывать его вручную. Он должен вызываться автоматически. Твой код его не вызывает. Я уже несколько раз обратил внимание, что все крутится вокруг проблемы вызова этого метода. Находи его в исходниках, ставь там дебагер и смотри, что и когда он сохраняет.
Troodi Larson, потому что дёргать этот метод руками — не самая лучшая затея, и не надо смущать ею юные умы. А не юные умы читают доку по API или смотрят код.
Возвращаясь к исходному вопросу — ты уже столкнулся с тем, что следующий запрос не видит данных в сессии, потому что они ещё не успели записаться или думаешь, что столкнёшься с этим?
JhaoDa, Знаете, по итогу я выяснил, что сессия у меня работала в целом верно. Но вот проблема почему она не сохраняла была гораздо проще. У меня были запросы в JS которые одновременно, обращались к серверу. И один метод сохранял сессию, уже после сохранения первой, тем самым переопределяя её, не уверен что я сказал верно, но примерно суть передал.