开发者社区> 问答> 正文

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

1.刚开始接触mongodb,然后查询到PHP的DRIVER并不支持HTTP RANGE header,这样就无法支持断点续传,不知道该如何查询下去,不知道最近的mongoDB的php client有没有支持这个?
2.我自己想着应该可以用mongodb的chunks来实现一种断点续传,每个块默认是256K,程序根据自己下载的文件大小判断下载了多少个块,然后再请求下一块,遇到下载的chunks不是整数,删除不是整数的那一部分,然后从整数+1的那一个chunks继续下载。这种方案是否可行呢?

展开
收起
蛮大人123 2016-02-13 17:32:57 2933 0
1 条回答
写回答
取消 提交回答
  • 我说我不帅他们就打我,还说我虚伪

    关于php、关于HTTP RANGE、关于断点续传
    •从php手册上看$_SERVER数组的信息是从Web服务器创建的信息获取,并不关php是否支持,要看你用的web服务器软件是否允许。虽然手册上并没有列出HTTP_RANGE信息。但是相关的例子不少。我看到写的较严谨的例子:http://www.thomthom.net/blog/2007/09/php-resumable-download-server/
    •你可以自己本地建立一个简易测试。比如使用它做现成测试:http://php.net/manual/zh/function.fread.php#106999
    •下载文件,暂停再点继续。如果没有做断点续传是回到初始重新开始或者下载器报异常(你可删除相关http_range代码,验证一个事实)。事实上是php做断点续传是可行的。
    其实比较憋屈,文件服务器做的事让php去做了。如果是大文件,用fread一下子全部读出来,php基本会抛出异常,提示内存不够。那这里还要去控制一个读出限制。
    比如我前面说那例子中是这么处理的(我简化了部分)。每次读出最多1024 * 8个字节数,到达EOF 的时候完成。
    screenshot
    可以想象下,如果服务器(不管是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/bin/answer.py?hl=zh-Hans&answer=1672758&topic=1719827&ctx=topic

    2019-07-17 18:42:15
    赞同 展开评论 打赏
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
阿里云栖开发者沙龙PHP技术专场-直面PHP微服务架构挑战-高驰涛 立即下载
PHP安全开发:从白帽角度做安全 立即下载
PHP 2017.北京 全球开发者大会——高可用的PHP 立即下载