您好,匿名用户
随意问技术百科期待您的加入

Mongo使用PHP进行断点续传的问题

0 投票

1.刚开始接触mongodb,然后查询到PHP的DRIVER并不支持HTTP RANGE header,这样就无法支持断点续传,不知道该如何查询下去,不知道最近的mongoDB的php client有没有支持这个?

2.我自己想着应该可以用mongodb的chunks来实现一种断点续传,每个块默认是256K,程序根据自己下载的文件大小判断下载了多少个块,然后再请求下一块,遇到下载的chunks不是整数,删除不是整数的那一部分,然后从整数+1的那一个chunks继续下载。这种方案是否可行呢?

用户头像 提问 2013年 11月14日 @ Poseidon 上等兵 (188 威望)
分享到:

1个回答

0 投票

关于php、关于HTTP RANGE、关于断点续传

  • 从php手册上看$_SERVER数组的信息是从Web服务器创建的信息获取,并不关php是否支持,要看你用的web服务器软件是否允许。虽然手册上并没有列出HTTP_RANGE信息。但是相关的例子不少。我看到写的较严谨的例子:http://www.thomthom.net/blog/2007/09/...
  • 你可以自己本地建立一个简易测试。比如使用它做现成测试:http://php.net/manual/zh/function.fre...
  • 下载文件,暂停再点继续。如果没有做断点续传是回到初始重新开始或者下载器报异常(你可删除相关http_range代码,验证一个事实)。事实上是php做断点续传是可行的

其实比较憋屈,文件服务器做的事让php去做了。如果是大文件,用fread一下子全部读出来,php基本会抛出异常,提示内存不够。那这里还要去控制一个读出限制。
比如我前面说那例子中是这么处理的(我简化了部分)。每次读出最多1024 * 8个字节数,到达EOF 的时候完成。

// Start buffered download
$buffer = 1024 * 8;
while(!feof($fp))
{
    set_time_limit(0); // Reset time limit for big files
    echo fread($fp, $buffer);
    flush(); // Free up memory. Otherwise large files will trigger PHP's memory limit.
}
fclose($fp);

可以想象下,如果服务器(不管是ftp还是http等等)他们不允许断点。那些众多的下载软件基本没市场了。目的服务器支持多线程最好了,如果不允许也没关系,到其他下载点返回一个断点,继续下载,自己实现一个多断点下载。这也是下载软件的基本原理。

Gridfs Mongodb存储
你所描述的“用mongodb的chunks来实现一种断点续传”这是错误的理解。断点这不关数据库的事。你所描述的是一个读取过程,控制的一个数据输出。并且因为HTTP本身协议原因,它没能力让你“删除不是整数的部分”你只能判断出具体文件字节流,再做细致数据输出。

其实你应该往”Gridfs Mongodb存储“方向去做应用。

gridfs就是做你所描述的类似的事情。将文件分割存储到mongodb。读出时再整合。其中内部机制我没研究,但肯定比你自己实现要有效率的多。你如果有兴趣可以去研究下。针对php的mongodb驱动也是评价非常好的。使用gridfs替换原始文件存储是可行的。

并且如果你使用的是Nginx服务器软件,可以避开php读取。直接做成Nginx模块。让Nginx去读取文件,会比使用php更高效。当然了写入还是用php。

HTTP 断点上传有难度,单纯的依靠它自身实现不了。目前的方案挺多:java、flash、silverlight、activex等等做客户端控制,然后服务器端再做处理等等。目前我知道的做的比较优秀的是Youtube:https://support.google.com/youtube/bi... (需要翻一下)

用户头像 回复 2013年 11月13日 @ Janna 下士 (667 威望)
提一个问题:

相关问题

0 投票
1 回复 34 阅读
用户头像 提问 2013年 11月16日 @ Apollo 上等兵 (269 威望)
+1 投票
1 回复 70 阅读
用户头像 提问 2012年 12月1日 @ Anivia 上等兵 (276 威望)
0 投票
1 回复 152 阅读
用户头像 提问 2012年 12月1日 @ Sagittarius 上等兵 (289 威望)
0 投票
1 回复 42 阅读
用户头像 提问 2012年 12月1日 @ Pikachu 上等兵 (475 威望)
0 投票
1 回复 31 阅读
用户头像 提问 2013年 11月8日 @ Swain 上等兵 (232 威望)

欢迎来到随意问技术百科, 这是一个面向专业开发者的IT问答网站,提供途径助开发者查找IT技术方案,解决程序bug和网站运维难题等。
温馨提示:本网站禁止用户发布与IT技术无关的、粗浅的、毫无意义的或者违法国家法规的等不合理内容,谢谢支持。

欢迎访问随意问技术百科,为了给您提供更好的服务,请及时反馈您的意见。
...