Php Laravel4-会话在同时请求时消失
我有一种购物篮,出于各种原因,我将内容保留为单独的会话 问题是,当我同时向下面的add函数发送请求时,Laravel会丢失以前的、不相关的/不同的会话,并保留最后一个会话,但如果我等待前一个进程完成,它工作正常 我认为问题在于Laravel的会话管理方法,它试图将所有内容保存在数据库中的单个文件或单个字段中。如果是这样,我看不到任何解决方案,但这里的代码Php Laravel4-会话在同时请求时消失,php,session,laravel-4,Php,Session,Laravel 4,我有一种购物篮,出于各种原因,我将内容保留为单独的会话 问题是,当我同时向下面的add函数发送请求时,Laravel会丢失以前的、不相关的/不同的会话,并保留最后一个会话,但如果我等待前一个进程完成,它工作正常 我认为问题在于Laravel的会话管理方法,它试图将所有内容保存在数据库中的单个文件或单个字段中。如果是这样,我看不到任何解决方案,但这里的代码 public function add($param1, $param2, $param3, $param4){ sleep(2);
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是itemCount
,has\u session\u此
是session::has($key)
的响应,session\u 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才能工作 这看起来像是事务问题。打开会话时,Laravel是否未锁定会话?我对拉威尔没有任何经验,所以我不知道。如果会话被锁定,并且您必须等待它被解锁,那么您永远无法获得这些并发性问题。锁定是PHP中默认会话处理程序的工作方式。我也在想同样的问题,但它似乎没有做到这一点。我最不想做的就是处理这些问题,但我想这是不可避免的。谢谢您的评论。@Halcyon-Laravel使用Symfony会话-它锁定会话以防止出现此问题。问题出在其他地方。这就是我使用唯一会话密钥的原因。请参阅下面的评论。您的意思是什么-独特的会话密钥如何重要?如果第一个函数未运行-无论发生什么情况,计数仍将为1。在第一个函数完成之前,计数不会增加。如果“has_session_this”为真,laravel显然不会丢失会话。laravel将所有会话键-值对保存在同一个文件中(就像PHP本身),但会话类(实际上是文件系统类)不会锁定该文件进行写入。因此,同一函数的不同实例会使用自己的数据覆盖同一文件,这就是结果。正如Halcyon所说,这纯粹是一个交易问题。不,不是。Count()是数据库中的行数?对的您甚至没有将count()添加到会话中。所发生的一切就是在数据库中仍然只有一行的情况下检索“count()”。然后,您同时运行多个查询-但没有获得新的count()-您使用的是原始请求中的旧count()。这与会话无关。