我有一个购物篮,出于各种原因,我将内容保存为单独的会话。
问题是,当我发送同步请求到以下添加函数,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为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...}
看来你的逻辑出了问题。与会话无关。
如果前面的功能没有完成-则计数从1开始。只有当前一个功能完成时,计数才会增加。
但是你使用的是$this->count()
-所以当你启动这个函数时,它看起来可能会得到当前会话对象的计数-而不是更新的计数。
如果你想确保一个正确的计数增量-你需要使用
Cache::increment('key')
你的缓存驱动程序需要Memcache或Redis为它的工作。