php - 如何获取客户端成功下载2GB文件的次数?
问题描述
我需要向客户(收到个人下载令牌)提供 2 GB 文件,我目前使用这个:
if (is_valid_download_token($token)) {
log_download_start(); // logs token, date, IP
header("X-Sendfile: /files/2GB_file.zip");
header("Content-type: application/octet-stream");
header('Content-Disposition: attachment; filename="2GB_file.zip"');
}
我希望我的自动化系统能够确保:
- 他们至少成功下载了一次文件(我定期运行一个脚本来检查这个)
- 给定令牌的成功下载不超过 2 次(在此之后,我将返回一条消息)
那么,如何获取客户端成功下载2GB文件的次数呢?
到目前为止我尝试过的注意事项:
简单地增加一个计数器
log_download_start()
并不是一个好的解决方案,因为有人可能不得不重新启动 5 次下载(因为互联网连接不佳),直到它最终工作。另外,从日志中,我知道人们使用“下载管理器”将 2 GB 下载分成 20 个 100 MB 的下载请求,这完全没问题。因此,仅在开始时计算请求数量并不高效。
我使用 PHP + Apache +
X-Sendfile
的具体原因在Fastest Way to Serve a File Using PHP and Downloading files with download.php中有解释。TL;DR:我不希望 PHP 读取 2 GB 数据(这会减慢一切),而是让 Apache 直接处理请求。
解决方案
推荐阅读
- android - 模拟器中永远不会调用 onMarkerClick()
- docker - Pod 进入 CrashLoopBackOff 状态并反复重启 - 退出代码为 0
- apache - 允许 Cachet 与其他网站一起运行
- html - WCAG:应用样式时,Firefox 和 Edge 不会在焦点输入元素上显示轮廓
- angular - “对象不支持属性或方法‘包含’”-[对象错误]
- python - matplotlib:再次单击按钮后删除滑块
- r - 为什么这个 Rvest 没有返回任何值?
- sqlite - SQLite - 防止多次评估缓慢的 CTE
- google-cloud-platform - Terraform:如何使用堆栈驱动程序指标在 GCP 中自动缩放托管实例组
- android - 模拟器:恐慌:缺少“x86”CPU 的模拟器引擎程序。在 Windows10 上