限制并行/同时下载 - 如何知道下载是否被取消?

2024-01-24

我有一个用 PHP 编写的简单文件上传服务,其中还包括一个脚本,当用户请求从此站点下载时,该脚本通过发送有限大小的数据包来控制下载速度。

我想实现一个系统,将每个用户的并行/同时下载限制为 1(如果他们不是高级会员)。在上面的下载脚本中,我可以使用 MySQL 数据库来存储包含以下内容的记录: (1) 用户 ID; (2) 文件编号; (3) 何时开始下载; (4) 当发送最后一个数据包时,每次完成都会更新(如果 DL 速度限制为 150 kB/秒,则每 150 kB 之后更新此记录,等等)。

但是,到目前为止,只有在下载成功完成后才会删除数据库记录 - 在脚本末尾,下载完成后,该记录将从表中删除:

insert DB record;
while (download is being served) {
    serve packet of data;
    update DB record with current date/time;
}
// Download is now complete
delete DB record;

我如何才能检测到下载何时被取消?我是否只需要有一个 Cron 作业(或类似的东西)来检测现有的下载记录是否超过 X 分钟/小时?或者还有什么我可以做但我错过了的事情吗?

我希望我已经解释得足够好了。我认为不需要发布具体代码;我对如何/是否可以做到这一点的后勤工作更感兴趣。如果需要具体的,我很乐意提供。

注意:我知道如何检测文件是否已成功下载;我需要知道如何检测它是否被取消、中止或以其他方式停止(而不仅仅是暂停)。这对于停止并行下载以及防止用户取消下载 #1 并尝试启动下载 #2 却发现该网站声称他仍在下载文件 #1 的情况非常有用。

编辑:您可以在这里找到我的下载脚本:http://codetidy.com/1319/ http://codetidy.com/1319/— 它已经支持多部分下载和恢复下载。


<?php

class DownloadObserver
{
  protected $file;
  public function __construct($file) {
    $this->file = $file;
  }

  public function send() {
    // -> note in DB you've started
    readfile($this->file);
  }

  public function __destruct() {
    // download is done, either completed or aborted
    $aborted = connection_aborted();
    // -> note in DB
  }
}

$dl = new DownloadObserver("/tmp/whatever");
$dl->send();

应该可以正常工作。不需要 shutdown_function 或任何时髦的自建连接观察。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

限制并行/同时下载 - 如何知道下载是否被取消? 的相关文章

随机推荐

  • 在闪亮的多列中对齐单选按钮

    在我闪亮的应用程序中 我有 4 个单选按钮 我想将它们渲染为两列和两行 但是 当我运行应用程序时 标题标签占据第一个位置 使其在第一列中三行 在第二列中两行 这里的问题是 第二列中的第一个单选按钮与标签对齐 而不是第一列中的第一个单选按钮
  • 如何使我的搜索表单适用于大写和小写

    我希望我的搜索表单可以使用大写和小写 因此 每当我输入小写内容时 它也会在我正在搜索的表中显示大写结果 这是我的 JavaScript function searchFunction var searchText document getE
  • R 项目组合

    我正在使用 R 希望找到消费者之间最常见的配对 consumer c 1 1 1 1 1 2 2 2 2 3 3 4 4 4 4 5 items c apple banana carrot date eggplant apple banan
  • MT5/Metatrader 5 使用python连接不同的MT5终端

    我有多个使用以下代码连接到 Mt5 终端的 python 程序 Establish connection to the MetaTrader 5 terminal if not mt5 initialize C Program Files
  • 无法在 Windows 10 ssh 服务器上使用公钥登录

    我已经安装了 Windows 10 ssh 软件包并设置了 sshd 使用密码登录效果很好 但我无法使用公钥登录 我有同样的authorized keys文件输入 ssh authorized keys正如我在 Linux 机器上所做的那样
  • 在 gevent 应用程序中,如何杀死所有已启动的 greenlet?

    我有一个 gevent 应用程序 可以跨多个模块生成多个 greenlet 我希望能够正常关闭应用程序 无论是内部还是通过捕获SIGTERM 例如 允许 greenlet 通过捕获来很好地终止GreenletExit并执行finally 条
  • 转储整个数组:console.log 和 console.dir 输出“... NUM more items]”

    我正在尝试记录一个长数组 以便可以在终端中快速复制它 但是 如果我尝试记录数组 它看起来像 item item gt gt more items lt lt lt 399 more items 如何记录整个数组以便我可以快速复制它 Sett
  • Tkinter:设置“比例”值而不触发回调?

    我有一个 Tkinter GUI 其中有一个Scale目的 我分配了一个回调 由command构造函数参数 以在用户更改刻度位置时执行操作 然而 也存在一种情况 刻度表示的值被外部修改 所以我使用设置刻度位置Scale set 在这种情况下
  • 如何在 Bitbucket 项目中使用 SSH 密钥?

    我在 Bitbucket 中生成和使用 SSH 密钥的步骤 ssh keygen t rsa C my email cat ssh id rsa pub 复制我的钥匙ssh rsa AAAAB3Nz my email到剪贴板 在 bitbu
  • 在指令模板内如何让 Angular ui-router ui-sref 工作?

    基本上 我正在尝试更改 自定义 ui bootstrap accordion 的行为 除了与 ui router 的集成之外 一切正常 这是我想要使用手风琴的方式
  • Jaxb:为固定值属性生成常量值

    我目前正在开发一个使用以下结构的 xsd
  • Visual Studio 2017 Node.js 异常不起作用

    我刚刚开始使用 VS 2017 Professional 进行 Node js 开发 调试通常可以工作 但是当抛出未捕获的异常时 nodejs 进程会立即停止 并且我没有任何更改来跟踪问题 我还在调试器设置中启用了nodejs exptio
  • 通过安装程序 (MSI) Windows 7 更新 Node.js 时看不到最新版本

    我正在尝试更新 Windows 7 机器上的节点 但在重新安装 更新节点后我没有看到最新版本 我只是出去http nodejs org download http nodejs org download 并获取最新的 Windows 安装程
  • 用户友好且难以猜测的唯一标识符

    我的团队正在开发一个具有旧数据库的应用程序 该数据库使用两个不同的值作为 Group 对象的唯一标识符 Id是一个自动递增的 Identity 列 其值由插入时的数据库确定 GroupCode由应用程序决定after插入 并且是 Group
  • 优化“where date Between”类型查询的 Dax 和模型

    我正在构建一个模型以允许报告两个单独的数据集 在本例中 我们将说学生数据集和员工数据集 数据集非常独立 两者之间唯一真正的联系是日期 因此从模型的角度来看 有一个学生星型模式和一个员工星型模式 显示的数据是快照类型数据 回答如下问题 对于选
  • 将 OpenCV 代码从 C++ 转换为 Java

    我目前正在尝试将一些遗留代码从 iPhone 迁移到 Android 此代码使用 OpenCV 库进行一些图像处理 总的来说 一切进展顺利 但我被一行代码困住了 我不知道如何将其转换为 Java 代码 Scalar dMean Scalar
  • 查明之前是否安装了特定的 Android 应用程序

    我有一个应用程序 它为您提供各种应用程序的列表 您可以从 Play 商店下载并安装这些应用程序来赚取好东西 现在 我不希望用户卸载以前安装的应用程序和再次下载通过我的应用程序并赚取好东西 有没有办法查明用户设备上以前是否安装过特定应用程序
  • 重新实现 ToUpper()

    如果 ToUpper 不存在 你会如何编写它 i18n 和 L10n 的奖励积分 由此引发了好奇心 http thedailywtf com Articles The Long Way toUpper aspx http thedailyw
  • heroku-rails-权限被拒绝(公钥)

    heroku create Creating floating planet 1824 done stack is bamboo mri 1 9 2 http floating planet 1824 heroku com email pr
  • 限制并行/同时下载 - 如何知道下载是否被取消?

    我有一个用 PHP 编写的简单文件上传服务 其中还包括一个脚本 当用户请求从此站点下载时 该脚本通过发送有限大小的数据包来控制下载速度 我想实现一个系统 将每个用户的并行 同时下载限制为 1 如果他们不是高级会员 在上面的下载脚本中 我可以