通过HTTP发送大文件

6
我有一个PHP客户端,通过HTTP请求XML文件(即通过URL加载XML文件)。目前,XML文件的大小只有几KB。我预见到的问题是,XML文件的大小可能会变成几MB或GB。我知道这是一个巨大的问题,可能有无数的解决方案,但你有什么想法将这些数据传输给客户端呢?
谢谢!
11个回答

7

根据您的使用情况,我强烈建议先将数据压缩。此外,您可能需要在启动下载之前对文件进行MD5哈希并进行比较(如果文件没有更改,则无需更新),这将有助于第二个问题。

另外,是否可以只发送已更改的XML片段而不是整个文件?


发送分段是个好主意,而且绝对可行。 - CoolGravatar
很好,我建议在传输之前在两端对整个文件进行哈希比较。如果有更新,只需发送该段(如上所述压缩为gzip),然后在“客户端”将其拼接在一起。如果您不受XML的限制,也许更轻量级的解决方案(JSON?)可能更好。 - Owen

4

2
考虑到XML是通过您的PHP动态创建的,我能想到的最简单的方法就是确保Web服务器自动压缩文件,就像这里所描述的那样,它提供了一种通用的PHP方法和一个Apache httpd特定的解决方案。
除此之外,让浏览器(还有什么可以作为PHP客户端?)每晚执行一些数据同步的工作听起来必须有一个更简单的解决方案。
当然,在某个时候,传输“很多”数据将需要“很多”时间...

还有什么可以作为PHP客户端呢?另一个服务器 - 比如soapclient =P - Peter Bailey
在本地运行,PHP 可以通过 CLI 下载文件,这可以作为定时任务添加。 - nickf

1
问题在于他正在同步两个数据集。这个问题完全被错误地陈述了。
你需要做的是:要么a)保留对数据集A所做更改的差分日志,以便将该日志发送到数据集B;要么b)保留数据集的两个副本(昨晚和当前数据集),然后进行比较,以便你可以将A的差分日志发送到B。
欢迎来到复制的世界。
(a)的问题在于它可能会影响到你所有的代码,但如果你使用RDBMS,你可以通过数据库触发器记录插入/更新/删除操作,并将信息写入表中,然后将相关行导出为差分日志。但是,这也可能很麻烦。
(b)的问题在于需要一次性“比较数据库”。100行还好,但10^9行就不好了。非常糟糕。
实际上,这一切都可能很糟糕。复制是很麻烦的。
更好的计划是研究一下专门为你运行的特定数据库设计的“真正”的复制系统(假设你正在运行数据库)。也许有些系统可以将数据库日志记录发送过来进行同步,而不是试图自己开发。
大多数现代DBMS系统都有复制系统。

0

Gallery2 允许您通过 http 上传照片,但也需要设置一些 PHP 参数,如post_max_sizeupload_max_filesize等,以便允许较大的上传。你可能需要考虑这个。

在我看来,发布大文件时会遇到浏览器超时等问题,但好处是它与代理服务器和防火墙配合得比尝试其他文件上传协议更好。


浏览器不应该有问题,我曾经使用HTTP上传过一个3GB的文件到我的一个应用程序中。虽然花了大部分时间,但最终还是上传成功了。 - Ady

0

感谢回复。我忘了提到传输文件应该相对快速(最多几分钟,这真的可能吗?)。请求的XML将在每晚解析并插入数据库中。XML可能与前一晚相同,也可能不同。有一个提出的解决方案是压缩XML文件,然后传输它。因此基本上有两个要求:1.它必须相对快速2.它应该尽量减少对数据库的写入。

提出的一个解决方案是压缩XML文件,然后传输它。但这只满足(1)

还有其他想法吗?


你先说XML可能会增长到几GB,现在又说“最多几分钟”。这两者不可兼得。 - Paul Tomblin

0

有没有可以用来压缩XML的算法?像MP3这样的大文件是如何在几秒钟内下载的?


这完全是另一回事,这取决于您的服务器上传速度和用户(或其他机器)的下载速度,当然还有中间的所有随机管道 :) - Owen
MP3文件不会很大,数量也不会超过几个GB。 - Shinhan

0

PHP 接收大量数据会花费很长时间并且会增加开销,而且更容易出现缺陷。

我建议将任务分派给一个 shell 脚本(使用 wget 并进行简单的错误捕获),它不受执行时间的影响,如果失败了,甚至可以自行重试。

虽然我没有经验,但我认为可以使用 exec() 或类似的方法,但这些方法很遗憾地是模态运行的。

通过调用脚本 **./test.sh &** 让它在后台运行,解决了这个问题 / 我猜。该脚本可以轻松地让 PHP 通过 wget `http://yoursite.com/continue-xml-stuff.php?id=1049381023&status=0` 恢复它。如果您不需要追溯丢失的请求,则 id 可以是文件名。状态将指示脚本如何处理请求。


0
你有没有考虑使用某种版本控制系统来处理这个问题?你可以利用它计算和发送文件差异的能力,此外还可以获得维护文件版本历史记录的额外好处。

0

由于我不知道你的具体情况,所以我会提出一个问题。仅仅为了讨论,它必须是HTTP吗?FTP更适合大数据传输,并且可以通过PHP或Perl轻松自动化。


它不一定非得是HTTP。那是最初的计划,但我可以自由选择任何协议...FTP可能可行。然而,我正在尝试压缩XML然后通过HTTP发送它。 - CoolGravatar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接