【问题标题】:Laravel4 - Sessions are disappearing on simultaneous requestsLaravel4 - 会话在同时请求时消失
【发布时间】: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);
} 

计数是项目counthas_session_thisSession::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 会话 - 锁定会话以防止这个确切的问题。问题出在其他地方。

标签: php session laravel-4


【解决方案1】:

看起来你的逻辑有问题。与会话无关。

如果之前的功能尚未完成 - 那么计数从 1 开始。只有当/当之前的功能完成时,计数才会增加。

但是您使用的是$this->count() - 所以它看起来可能是在您启动函数时获取当前会话对象的计数 - 而不是更新的计数。

如果您想确保正确的计数增量 - 您需要使用

Cache::increment('key')

您的缓存驱动程序需要 Memcache 或 Redis 才能工作。 See docs for more info.

【讨论】:

  • 这就是我使用唯一会话密钥的原因。请参阅下面的 cmets。
  • 你是什么意思 - 唯一的会话密钥有什么关系?如果第一个函数没有运行 - 无论如何计数仍然是 1。在第一个函数完成之前,计数不会增加。
  • 附注如果“has_session_this”为真,laravel 显然不会丢失会话。
  • Laravel 将所有会话键值对保存在同一个文件中(如 PHP 本身),但会话类(实际上是文件系统类)不会锁定该文件以进行写入。结果,同一函数的不同实例用自己的数据覆盖同一文件,这就是结果。正如 Halcyon 所建议的,这纯粹是一个交易问题。
  • 不,不是。 Count() 是数据库中的行数?正确的?您甚至没有将 count() 添加到您的会话中。正在发生的只是在数据库中仍然只有 1 行时正在检索“count()”。然后您同时运行多个查询 - 但您没有获得新的 count() - 您正在使用原始请求中的旧 count()。这与会话无关。
猜你喜欢
  • 2014-05-24
  • 1970-01-01
  • 2018-02-09
  • 1970-01-01
  • 2011-03-20
  • 2012-12-22
  • 1970-01-01
  • 1970-01-01
  • 2014-11-06
相关资源
最近更新 更多