我有一种购物篮,由于各种原因,我将内容保持为单独的会话。
问题是,当我同时向以下添加功能发送请求时,Laravel会丢失之前的,无关的/不同的会话并保留最后一个会话,但如果我等待上一个流程完成,则它正常工作。
我认为问题是Laravel的会话管理方法,它试图将所有内容保存在数据库中的单个文件或单个字段中。如果是这样,我没有看到任何解决方案,但这是代码;
public function add($param1, $param2, $param3, $param4){
sleep(2);
$results = DB::select("CALL ...(?, ?, ?, ?)", array($param1, $param2, $param3, $param4));
$sessionName = "basket-item-$param1-$param2-$param3-$param4";
$selectionIDs = array();
$status = null;
if(!Session::has($sessionName)){
if($results){
foreach($results as $result){
$selectionIDs[] = $result->selection_id;
}
}
if($selectionIDs) Session::put($sessionName, $selectionIDs);
$status = 'new';
}
return array('count' => $this->count(), "has_session_this" => Session::has($sessionName), 'session_name' => $sessionName, 'status' => $status);
}
计数是项count
,has_session_this
是Session::has($key)
的回复,session_name
是$key
ADD TO BASKET RESPONSE : Object { count=1, has_session_this=true, session_name="basket-item-1-256-7894628-21494", more...}
ADD TO BASKET RESPONSE : Object { count=2, has_session_this=true, session_name="basket-item-1-256-14834686-21494", more...}
ADD TO BASKET RESPONSE : Object { count=3, has_session_this=true, session_name="basket-item-1-256-21132688-21494", more...}
ADD TO BASKET RESPONSE : Object { count=4, has_session_this=true, session_name="basket-item-1-256-3500057-21494", more...}
这是预期的结果,如果我不等待回应;
ADD TO BASKET RESPONSE : Object { count=1, has_session_this=true, session_name="basket-item-1-256-7894628-21494", more...}
ADD TO BASKET RESPONSE : Object { count=1, has_session_this=true, session_name="basket-item-1-256-14834686-21494", more...}
ADD TO BASKET RESPONSE : Object { count=1, has_session_this=true, session_name="basket-item-1-256-21132688-21494", more...}
ADD TO BASKET RESPONSE : Object { count=1, has_session_this=true, session_name="basket-item-1-256-3500057-21494", more...}
任何帮助,任何想法都表示赞赏。
答案 0 :(得分:0)
看起来你的逻辑有问题。与会话无关。
如果之前的功能尚未完成 - 那么计数从1开始。只有当前一个功能完成时,计数才会增加。
但是你正在使用$this->count()
- 所以看起来当你启动函数时它可能会获得当前会话对象的计数 - 而不是更新的计数。
如果您想确保正确的计数增量 - 您需要使用
Cache::increment('key')
你的缓存驱动程序需要是Memcache或Redis才能工作。 See docs for more info