1.刚开始接触mongodb,然后查询到PHP的DRIVER并不支持HTTP RANGE header,这样就无法支持断点续传,不知道该如何查询下去,不知道最近的mongoDB的php client有没有支持这个?
2.我自己想着应该可以用mongodb的chunks来实现一种断点续传,每个块默认是256K,程序根据自己下载的文件大小判断下载了多少个块,然后再请求下一块,遇到下载的chunks不是整数,删除不是整数的那一部分,然后从整数+1的那一个chunks继续下载。这种方案是否可行呢?
回复内容:
1.刚开始接触mongodb,然后查询到PHP的DRIVER并不支持HTTP RANGE header,这样就无法支持断点续传,不知道该如何查询下去,不知道最近的mongoDB的php client有没有支持这个?
2.我自己想着应该可以用mongodb的chunks来实现一种断点续传,每个块默认是256K,程序根据自己下载的文件大小判断下载了多少个块,然后再请求下一块,遇到下载的chunks不是整数,删除不是整数的那一部分,然后从整数+1的那一个chunks继续下载。这种方案是否可行呢?
关于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... (需要翻一下)
从原理上说,GridFS至少应该支持按照Chunk来读写,所以断点续传是可以实现的。但是由于目前的php sdk里头没有细化到chunk这一层,所以如果需要这么做的话,可能得自己改改。
mongodb 的 chunks 写入后不支持修改,所以你要注意到如果 chunks 尺寸过大会让你在下次传递的时候丢失一部分数据,上传客户端也先要从服务器获取已经上传的 chunks 的数量乘以尺寸为续传应该开始的地方。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。

PHP中使用clone關鍵字創建對象副本,並通過\_\_clone魔法方法定制克隆行為。 1.使用clone關鍵字進行淺拷貝,克隆對象的屬性但不克隆對象屬性內的對象。 2.通過\_\_clone方法可以深拷貝嵌套對象,避免淺拷貝問題。 3.注意避免克隆中的循環引用和性能問題,優化克隆操作以提高效率。

PHP適用於Web開發和內容管理系統,Python適合數據科學、機器學習和自動化腳本。 1.PHP在構建快速、可擴展的網站和應用程序方面表現出色,常用於WordPress等CMS。 2.Python在數據科學和機器學習領域表現卓越,擁有豐富的庫如NumPy和TensorFlow。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

Dreamweaver CS6
視覺化網頁開發工具

WebStorm Mac版
好用的JavaScript開發工具

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境

記事本++7.3.1
好用且免費的程式碼編輯器