在PHP中一次限制1次下载

Awa*_*rni 5 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();
}
Run Code Online (Sandbox Code Playgroud)

jis*_*shi 1

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

(伪代码)

obtain_lock_somehow();
readfile('yourvideofile.mpg');
release_lock();
Run Code Online (Sandbox Code Playgroud)

我不知道脚本将如何响应关闭的连接,并且它可能会强制脚本提前结束。

另一种选择是读取文件并以“块”形式传递到流,在每个块之间更新访问者“锁定”的状态,以便您可以识别访问者实际下载内容的最后一个时间戳。

(伪代码)

while(file_is_not_finished) {
    update_lock_status();
    pass_thru_buffer();
}
Run Code Online (Sandbox Code Playgroud)

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