Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/299.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel4-会话在同时请求时消失_Php_Session_Laravel 4 - Fatal编程技术网

Php Laravel4-会话在同时请求时消失

Php Laravel4-会话在同时请求时消失,php,session,laravel-4,Php,Session,Laravel 4,我有一种购物篮,出于各种原因,我将内容保留为单独的会话 问题是,当我同时向下面的add函数发送请求时,Laravel会丢失以前的、不相关的/不同的会话,并保留最后一个会话,但如果我等待前一个进程完成,它工作正常 我认为问题在于Laravel的会话管理方法,它试图将所有内容保存在数据库中的单个文件或单个字段中。如果是这样,我看不到任何解决方案,但这里的代码 public function add($param1, $param2, $param3, $param4){ sleep(2);

我有一种购物篮,出于各种原因,我将内容保留为单独的会话

问题是,当我同时向下面的add函数发送请求时,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是item
Count
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()。这与会话无关。