如何跟踪当前从服务器下载的文件?

时间:2018-07-31 08:22:23

标签: php linux video hosting cpanel

我正在使用共享主机(hostgator)。
我有一个网站,视频内容是用php编写的youtube。
通过指向mp4文件和html video标签的直接链接实现。

我想将文件下载(播放)的连接数限制在350个左右。
因为如果连接超过350个,hostgator就会阻止我的网站。
有什么办法吗?
有关如何处理这种情况的任何其他建议也将有所帮助。

1 个答案:

答案 0 :(得分:0)

您可以使用处理实际文件下载的php脚本。如果执行了脚本,请增加下载计数器,如果文件已完全发送到客户端,则关闭连接。

要检测文件是否已完全发送,应分小块发送文件,并在每个发送的块之后检查连接是否仍打开。

为此

  • 发送正确的mime类型和http标头

  • 使用ignore_user_abort使脚本在客户端关闭连接时保持运行状态

  • 分小块发送文件,并在每个块之后检查连接是否仍然有效。 ob_flushflush用于保持输出缓冲区为空。 connection_statusconnection_aborted测试连接是否仍然打开。

  • 提交整个文件后,减少连接计数器

除此之外,您还可以实现HTTP_RANGE,以恢复不完整的下载。如果您想在流的中间寻找某个地方,这对于视频下载尤其重要。

.htaccess下面,它重写了对PHP文件的所有请求。

<IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteRule ^ yourFile.php [L]
</IfModule>

PHP文件下方

// code to increment the counter..
// increment_counter(); ...

// Use the request path (URI) to choose what file to send.
$filename = 'video.mp4';
$size = filesize($filename);
$f = fopen($filename, 'rb');

if (!$f) {
    // error...
}

ignore_user_abort(true);
set_time_limit(0);

header("Content-Length: $size");
header("Content-Type: video/mp4");

while (!feof($f)) {
    echo fread($f, 8192);
    ob_flush();
    flush();
    if (connection_status() != 0) {
        // download aborted... decrement the counter
        // decrement_counter(); ...
        break;
    }
}

fclose($f);

// download completed - decrement counter
// decrement_counter(); ...

此脚本非常简单,但是应该可以给您一个思路。您可以添加更多逻辑(如上面HTTP_RANGE所述)或发送其他标头,但这应该为您提供一个良好的起点。

参考

下面是鲜为人知的功能文档链接。

connection_status

ignore_user_abort