在PHP中一次限制1次下载

时间:2011-03-07 11:28:13

标签: php download

我正在制作一个视频网站,该网站包含不同的电影和视频,用户可以流式传输和下载。现在我被要求以这样的方式实施下载限制,即一次只能下载1个视频。有两个服务器:我的文件和数据库在一台服务器上,视频在另一台服务器上。

我正在做的下载工作是从第一台服务器向另一台服务器上的文件发送请求。如果请求的视频存在,则下载该视频。

现在我想限制用户,以便在他们已经下载视频时,他们无法下载另一个视频,直到当前下载完成。当前下载完成后,用户可以下载下一个视频。我还没有看到任何能让开发人员知道下载何时完成的功能。

我有一些关于将下载时间的信息存储在数据库中的事情。但是存储下载时间不是我的要求。

实现此目的的最佳方法是什么?是否有可以检测下载结束时间的事件?这有什么解决方案吗?我正在使用PHP,这是我用于从第二(视频)服务器下载文件的代码。此文件发送带有文件名和完整路径的请求。 $real_file变量包含文件名以及第二台服务器上的完整路径。

if(file_exists($real_file))
{
    header("Pragma: public"); 
    header("Cache-Control: private"); 
    header("Expires: 0"); 
    header('Cache-Control: no-store, no-cache, must-revalidate');
    header('Cache-Control: pre-check=0, post-check=0, max-age=0');
    header('Content-Transfer-Encoding: binary');
    header('Content-Encoding: none');
    header("Content-Disposition: attachment; filename=".urlencode(basename($real_file)));   
    header("Content-Type: application/force-download");
    header("Content-Type: application/octet-stream");
    header("Content-Type: application/download");
    header("Content-Description: File Transfer");            
    header("Content-Length: " . filesize($real_file));
    header("Accept-Length: ".filesize($real_file));

    $fp = @fopen($real_file, "rb");

    while(!feof($fp))
    {
        $buffer= fread($fp, 8192);
        echo $buffer;
    }

    @flush();
    @ob_flush();
    die();
}

1 个答案:

答案 0 :(得分:1)

如果您通过php脚本流式传输文件,它可能会在您开始读取文件并输出到流之前获取特定用户的锁定(当然已登录):

(伪代码)

obtain_lock_somehow();
readfile('yourvideofile.mpg');
release_lock();

我不知道脚本如何响应已关闭的连接,并且可能会强制脚本过早结束。

另一种选择是读取文件并以“块”传递给流,并在每个块之间更新访问者“锁定”的状态,以便您可以确定访问者实际上最后一个时间戳下载的东西。

(伪代码)

while(file_is_not_finished) {
    update_lock_status();
    pass_thru_buffer();
}

但请注意,在像这样的php脚本中流式传输大量数据可能不是最好的方法,而且使用本机服务器模块可能会更好。