我有一个用 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(使用前将#替换为@)