【发布时间】:2014-07-26 10:26:07
【问题描述】:
我有一个购物篮,出于各种原因,我将内容作为单独的会话保存。
问题是,当我向以下添加函数发送同时请求时,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...}
感谢任何帮助,任何想法。
【问题讨论】:
-
这看起来像是交易问题。打开会话时 Laravel 不会锁定会话吗?我对 Laravel 没有任何经验,所以我不知道。如果会话被锁定,并且您必须等到它被解锁,您将永远不会遇到这些并发问题。锁定是 PHP 中默认会话处理程序的工作方式。
-
我也想知道,但它似乎没有这样做。我想做的最后一件事就是处理这些,但我想这是不可避免的。顺便感谢您的评论。
-
@Halcyon - Laravel 使用 Symfony 会话 - 锁定会话以防止这个确切的问题。问题出在其他地方。