【问题标题】:Tracking file complete download跟踪文件完成下载
【发布时间】:2011-01-20 17:38:43
【问题描述】:

我有一个文件托管网站,用户通过下载获得奖励。所以我想知道有没有一种方法可以跟踪访问者是否下载了整个文件,这样就不会有虚假的部分下载只是为了奖励。

谢谢。

【问题讨论】:

  • 这些文件怎么会很大? KB?兆?
  • DK-Wamp 说“我可以了解有关此主题的其他详细信息吗? // 我尝试使用此脚本,但对我不起作用。:( // 我知道这是一个老话题,但希望能找到解决办法。”

标签: php apache2 ubuntu-server


【解决方案1】:

如果您可以监控您的网络服务器返回的 HTTP 响应代码并将它们与生成它们的会话联系起来,那么您就成功了。

响应代码 206 表明系统已传递了部分信息,但未传递全部信息。当文件的最后一块出去时,它不应该有 206 的响应代码。

如果您可以通过将会话代码放入 URL 中来将其与用户会话联系起来,那么您可以根据简单的日志聚合给出分数。

【讨论】:

  • 我手边没有任何 Apache 日志。您是否碰巧从可以发布的日志中获得文件传输的 sn-p?通过一个文件和一个 IP 地址对其进行过滤以获取相关条目。根据您的日志格式,找到文件最后一页的条目应该相对容易。
【解决方案2】:

我在一个文件托管网站上实现了类似的解决方案。

您要做的是使用 register_shutdown_function 回调,它允许您检测 php 脚本的执行结束,而不管结果如何。

然后你想把你的文件放在你的服务器上一个不可通过网络访问的位置,并让你的下载通过 php:想法是你希望能够跟踪有多少字节被传递到客户。

这是一个基本的实现方式(例如:)

<?php
register_shutdown_function('shutdown', $args);

$file_name = 'file.ext';
$path_to_file = '/path/to/file';
$stat = @stat($path_to_file);

//Set headers
header('Content-Type: application/octet-stream');
header('Content-Length: '.$stat['size']);
header('Connection: close');
header('Content-disposition: attachment; filename='.$file_name);

//Get pointer to file
$fp = fopen('/path/to/file', 'rb');
fpassthru($fp);

function shutdown() {
  $status = connection_status();

  //A connection status of 0 indicates no premature end of script
  if($status == 0){
    //Do whatever to increment the counter for the file.
  }
}
>?

显然有改进的方法,所以如果您需要更多细节或其他行为,请告诉我!

【讨论】:

  • 是的,你是对的,这在很大程度上取决于网站的使用情况。在我们的应用程序中,我们曾经通过 php 管道下载所有文件,因为我们过去还验证了用户,并限制了带宽。关键是我们有专门的服务器来提供这些文件,并为运行 lighttpd 的后端存储服务器提供数据。我们通过自定义编译和禁用除基本模块之外的所有模块来减少 Apache 的占用空间。我们能够在 35 个前端处理大约 130 个同时下载/服务器,总吞吐量为 2.3Gbps...
猜你喜欢
  • 1970-01-01
  • 2011-05-29
  • 2010-09-05
  • 2010-12-29
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-01-20
相关资源
最近更新 更多