laravel - 控制器中的指令“有时”执行多次而不是 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() 每次都在执行。
我需要帮助来找出我在这项工作中做错了什么(只要能完成所要求的工作,也欢迎替代解决方案)。
旁注:我不是网络开发人员,如果我遗漏了任何重要内容,请原谅我的无知。
解决方案
通过简单地执行此操作,我能够找到使用 Cookies 而不是 Session 的工作解决方案(可能不是最好的,但在有人给出更好的解决方案之前完成工作):
if (!(Cookie::has((string)$id)))
{
$viewedPost = Post::where('id', $id);
$viewedPost ->increment('hits');
}
Cookie::queue((string)$id, true, 1);
推荐阅读
- mysql - 如何将 2 个表与另一个 3rd 表中的一个公共列连接起来?
- security - 如何将 HTTPS 重定向到不安全的 WS?
- multithreading - 使用多个子拓扑优化 Kafka Streams 应用程序
- terraform - Terraform 连接插值不附加到最后一个元素
- git - 如何 git mv 从 public_html 到 public_html/public 的所有文件
- sql - 具有相同表的多个连接的存储过程
- r - 是否可以使用类似 `tz=NULL` 的东西?... `as.POSIXct` 默认为依赖于语言环境的时区(与 `as.Date` 不同),这会导致问题
- database - 具有高数据量的清单应用程序的最佳数据库设计方法
- javascript - 使用带有 Flask 的蓝图的 csv 文件问题
- javascript - 对页面和 iframe 之间的多条消息双向使用 MessageChannel()