在数据库中存储唯一的下载请求


Store unique download requests in database

我正在尝试获取一些客户端信息并将每个下载文件请求存储在数据库中。存储所有需要的信息后,正在处理下载请求:

return response()->download($file_path);

问题在于,在每个请求(主要是由下载管理器)上,都会与同一URL建立许多连接,因此应用程序将用户在同一请求上存储多行。

我想限制每个唯一的客户端请求而不是每个连接的存储。我认为阻止多个连接会为我做到这一点,所以我添加了Accept-Ranges标头:

return response()->download($file_path, null, ["Accept-Ranges" => "None"]);

尽管下载不再可恢复,但数据库中存储了多行。(但是比以前少得多)

避免在用户下载请求中插入多个数据库的最佳做法是什么?

* 请不要在不考虑多个重复和同时请求不同于多个唯一和同时请求的情况下回答或评论。否则有很多解决方案。

附言我不想用拉拉维尔标记我的问题。请不要添加它。

您是否尝试过在插入数据库之前检查Range标头值?

对于新的/唯一的下载请求,不应显示或从 0 开始。

要了解唯一用户,您需要身份验证系统。但是我看到您无法使用身份验证系统。

没有任何绝对的方法可以做到这一点。用户可以更改IP地址,删除或更改cookie等,因为一切都在他们手上。

您仍然可以插入ip,http_user_agent到数据库,还可以提高质量,您可以设置一些cookie来识别唯一用户。

此外,您可以使用PHP会话 - 用于用户管理系统。

session_start();
$id = session_id();

检查当前会话用户。如果已经有同一用户的下载请求,则更新请求,如果没有创建一个。

更新:

如果您根据评论使用会话和身份验证,请在下载请求到来时存储:

+----+---------+---------+-------------+-----------------+-----------------+
| id | user_id | file_id | status      | created_at      | updated_at      |
+----+---------+---------+-------------+-----------------+-----------------+
| 1  | 1       | 1       | in_progress | 1456477761.9624 | 1456477762.9624 |
+----+---------+---------+-------------+-----------------+-----------------+

当经过身份验证的用户请求下载特定文件时,请在数据库中添加指定其状态的行。每当出现任何新的文件下载请求时,您都会检查该用户和请求的文件的状态。如果存在记录,则不允许用户下载文件。

您可以

尝试存储用户代理并检查evry请求,如果用户代理相同,但是用户,可以尝试同时通过不同的浏览器/下载管理器下载,因此不能完全证明..但由于您在问题中提到您不支持/允许用户恢复下载..因此,在用户开始下载后,他可能会尝试通过不同的浏览器下载,但用户 IP 地址被更改的可能性非常小......因此,您可以存储用户浏览代理+用户IP地址,并在数据库中创建新条目之前检查每个请求是否相同。这可能不是 100% 的证据,但我猜您的问题将得到解决!