Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/294.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 在数据库中存储唯一的下载请求_Php - Fatal编程技术网

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

Php 在数据库中存储唯一的下载请求,php,Php,我试图获取一些客户端信息,并将每个下载文件请求存储在数据库中。存储了所有需要的信息后,正在处理下载请求: return response()->download($file_path); 问题在于,对于每个请求(主要由下载管理器执行),都会对同一URL建立许多连接,因此应用程序会按用户在同一请求上存储多行 我想将此存储限制在每个唯一的客户端请求上,而不是每个连接上。我认为阻止多个连接对我来说就行了,所以我添加了Accept Rangesheader: return response()-

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

return response()->download($file_path);
问题在于,对于每个请求(主要由下载管理器执行),都会对同一URL建立许多连接,因此应用程序会按用户在同一请求上存储多行

我想将此存储限制在每个唯一的客户端请求上,而不是每个连接上。我认为阻止多个连接对我来说就行了,所以我添加了
Accept Ranges
header:

return response()->download($file_path, null, ["Accept-Ranges" => "None"]);
虽然下载不再可以恢复,但数据库中存储了多行。(不过比以前少了很多)

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

*如果不考虑多个重复和同时的请求与多个唯一和同时的请求不同,请不要回答或评论。否则,有很多解决方案


另外,我不想把我的问题贴上拉威尔的标签。请不要添加它。

要了解唯一用户,您需要身份验证系统。但我看到你们不能使用认证系统

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

仍然可以在数据库中插入ip、http_user_agent,也可以设置一些cookie来识别唯一的用户,以提高质量

此外,您还可以使用-for用户管理系统

session_start();
$id = session_id();
检查当前会话用户。若已经有相同用户的下载请求,那个么更新请求,若并没有创建一个

更新:

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

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

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

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

在插入数据库之前,您是否尝试过检查
范围
标题值


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

您可以为每次下载提供一个唯一的id,该id将在url中可见,并且在某些时候会过期。因此,只要使用该ID恢复下载,就可以将其视为相同的下载。尽管在发送该文件的最后一个范围时,您必须注意是否使链接过期。这只是一个观点,我认为这不是一个好的做法。您可能会错过唯一的下载请求,因为您不知道该密钥的过期时间,并且可能有人在该特定时间段多次尝试下载文件@FRZ3993在插入数据库之前,您是否尝试过检查
范围
标题值?对于新的/唯一的下载请求,它不应显示或从0开始。为什么不为每个用户每x小时/天为每个特定文件实现一次下载。用户没有理由下载同一文件超过1次,除非下载已损坏或已停止下载?@max您是否可以发表您的评论作为答案?我接受。存储用户的IP地址和用户代理如何才能找到唯一的请求?此外,用户在发送下载请求之前会经过身份验证。这就是为什么我需要一些关于他们下载请求的信息。那么为什么你不能使用会话来识别下载请求呢?使用会话我们如何跟踪唯一的下载请求?当前用户在下载同一文件时,是否可能向该文件发送另一个下载请求?如果是,那么应该如何实现会话以识别将导致在数据库中仅存储2行的差异?关于上次编辑:实际上,我想存储所有下载请求,即使下载请求已存储在数据库中并且正在进行(正如您所说,其状态为
正在进行中
)。但我不想添加/更新同一下载请求的记录(正在进行的
下载),这是由多个连接到同一个文件URL引起的。@revo:按照我的想法,您也可以对状态为的文件使用下载表的
id
。在下载相同的文件之前,您可以使用
id
继续下载。完成下载后,您可以将状态更改为
completed
。我对你的要求感到困惑。你能详细解释一下你想发生什么和不想发生什么吗?