首页 > 解决方案 > 控制器中的指令“有时”执行多次而不是 Laravel 中的一次

问题描述

我试图在每次查看帖子页面时增加数据库中的一列。为此,我在创建帖子的 Controller 函数中提供视图之前添加了以下内容:

    public function index($id) {
        $post= Post::find($id);
        if($post){
            //I have here SEOMeta, OpenGraph and Twitter data settings...
            $viewedPost = Post::where('id', $id);
            $viewedPost ->increment('hits');
        }
        $meta = SEOMeta::generate() . OpenGraph::generate() . Twitter::generate();
        return view('post', compact('post', 'related', 'comments', 'meta'));
        } else{
        abort(404);

我注意到,使用此代码,“点击”增量有时会循环显示相同的视图,最终会出现错误数量的视图,尤其是当网站负载过重时。(我通过将 increment() 指令替换为将用户的 SessionID 和 IP 保存在一个表中来确认这一点。我最终得到了具有相同 SessionID 和 IP 的重复行)。

我试图通过保存已查看帖子的 SessionID 来找到解决方法,以确保在执行增量之前它不存在:

$user_session_id = Request::getSession()->getId();
        if (Session::has($id))
        {
            $exists = false;
            foreach(Session::get($id) as $existing_session):
            if ($existing_session == $user_session_id)
            {
                $exists = true;
                break;
            }
            endforeach;
            if (!$exists)
            {
                $viewedPost = Post::where('id', $id);
                $viewedPost ->increment('hits');    
            }               
            Session::push($id, $user_session_id);
        }
        else
        {
            Session::put($id, $user_session_id);
            $viewedPost = Post::where('id', $id);
            $viewedPost ->increment('hits');
        }

这样,在会话到期(120 分钟后)之前,不应该为相同的 SessionID 和相同的帖子执行 increment()。但是,当我不断刷新页面时,increment() 每次都在执行。

我需要帮助来找出我在这项工作中做错了什么(只要能完成所要求的工作,也欢迎替代解决方案)。

旁注:我不是网络开发人员,如果我遗漏了任何重要内容,请原谅我的无知。

标签: laravel

解决方案


通过简单地执行此操作,我能够找到使用 Cookies 而不是 Session 的工作解决方案(可能不是最好的,但在有人给出更好的解决方案之前完成工作):

        if (!(Cookie::has((string)$id)))
        {
            $viewedPost = Post::where('id', $id);
            $viewedPost ->increment('hits');
        }
        Cookie::queue((string)$id, true, 1);

推荐阅读