【问题标题】:How to track currently downloaded files from server?如何跟踪当前从服务器下载的文件?
【发布时间】:2018-07-31 21:14:12
【问题描述】:

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

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

【问题讨论】:

  • 创建一个处理下载然后计数的 PHP 页面。
  • 我已经尝试过了,但使用这种方法无法通过 html 视频标签播放视频
  • 你能放一些你可能已经尝试过或已经存在的代码
  • 您必须将 HTML 视频标签指向您的 PHP 文件才能正常工作。
  • 如前所述,我认为您应该创建一个 PHP 文件(前端控制器),一个将所有请求发送到 PHP 文件的 .htaccess,它是计算连接数的 PHP 文件和返回视频。

标签: php linux video hosting cpanel


【解决方案1】:

您可以使用处理实际文件下载的 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

【讨论】:

  • 这很有趣,但我认为作为答案,代码示例会很有用。
  • @AnthonyB 我加了一个例子
  • @Philipp 我已经尝试过您的解决方案。注意到它的一个问题(至少在 Firefox 中)。当您暂停视频时。浏览器停止下载但不关闭连接。还是仅仅因为 HTTP_RANGE?
  • 我投了赞成票。这个例子很有用,展示了如何逐块返回视频块。
  • @Philipp 我也使用此脚本gist.github.com/ivankristianto/8000648 实现了范围,并且似乎连接保持打开状态直到离开页面。即使文件完成下载
猜你喜欢
  • 2014-05-04
  • 2010-09-05
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多