通过HTTP发送大文件

时间:2008-10-29 18:39:56

标签: php xml http

我有一个通过HTTP请求XML文件的PHP客户端(即通过URL加载XML文件)。截至目前,XML文件的大小只有几KB。我可以预见的一个问题是XML的大小会变成几个MB或Gbs。我知道这是一个很大的问题,可能有无数的解决方案,但您有什么想法将这些数据传输给客户?

谢谢!

11 个答案:

答案 0 :(得分:5)

根据您的使用情况,我肯定建议首先压缩数据。此外,您可能希望md5散列文件并在启动下载之前对其进行比较(如果文件没有更改则无需更新),这将有助于第2点。

另外,是否可以只发送一段代替整个文件的XML?

答案 1 :(得分:4)

忽略浏览器可能或不可能处理GB大小的XML文件的程度,我能想到的唯一真正的问题是生成所有XML的执行时间是否大于任何执行在您的环境中设置的时间阈值。

答案 2 :(得分:2)

鉴于XML是使用PHP动态创建的,我能想到的最简单的方法是确保文件由Web服务器自动进行gzip压缩,如所描述的here,它提供了一般的PHP方法和Apache httpd特定的解决方案。

除此之外,拥有一个浏览器(还有什么可以是PHP客户端?)每天晚上做一些数据同步声音的工作,就像在其他地方必须有一个更简单的解决方案。

当然,在某些时候,转移“大量”数据将花费“很多”时间......

答案 3 :(得分:1)

问题在于他正在同步两个数据集。问题完全是错误的。

您需要a)保持对数据集A的更改的差异日志,以便将该日志发送到数据集B,或b)保留数据集的两个副本(昨晚和当前数据集),然后比较然后你可以将差异日志从A发送到B.

欢迎来到复制世界。

(a)的问题在于它可能侵入你的所有代码,但是如果你使用的是RDBMS,你可以通过数据库触发器进行一些记录,以跟踪插入/更新/删除,并编写信息到表中,然后将相关行导出为差异日志。但是,这也可能是令人讨厌的。

(b)的问题是整个“比较数据库”的全部问题。罚款100行。不适合10 ^ 9行。令人讨厌的讨厌。

事实上,它可能都很讨厌。复制很糟糕。

更好的计划是研究为您正在运行的特定数据库设计的“真实”复制系统(假设您正在运行数据库)。可能会发送数据库日志记录以进行同步而不是尝试自己滚动的东西。

大多数现代DBMS系统都有复制系统。

答案 4 :(得分:0)

Gallery2允许您通过http上传照片,可让您设置几个php参数post_max_sizeupload_max_filesize,以允许更大的上传。你可能想看一下。

在我看来,发布大型文件存在浏览器超时等问题,但从好的方面来看,它比代理服务器和防火墙更适合尝试不同的文件上传协议。

答案 5 :(得分:0)

感谢您的回复。我没有提到转移文件应该相对较快(最多几分钟,这甚至可能吗?)。每天晚上将解析所请求的XML并将其插入到数据库中。从前一天晚上开始,XML可能是相同的,也可能是不同的。提出的一个解决方案是压缩xml文件然后传输它。因此基本上有两个要求:1。它必须相对较快2.它应该最小化对数据库的写入次数。

建议的一个解决方案是压缩xml文件然后传输它。但那只满足(1)

还有其他想法吗?

答案 6 :(得分:0)

我是否可以应用任何算法来压缩XML?如何在几秒钟内下载MP3等大文件?

答案 7 :(得分:0)

接收GB数据的PHP将花费很长时间并且是开销。 更容易察觉到缺陷。

我愿意 - 将赋值发送到一个shellcript(wget,带有简单的错误捕获),这不会被执行时间所困扰,并且在失败时甚至可能会根据自己的优点重试。

对此没有经验,但是虽然可以使用 exec()或类似的,但这些可悲的运行模式。

使用**./test.sh &**调用脚本使其在后台运行并解决该问题/我猜。该脚本可以轻松让您的PHP通过wget“ http://yoursite.com/continue-xml-stuff.php?id=1049381023&status=0 ”进行备份。如果您不需要回溯丢失的请求,则id可以是文件名。状态将指示脚本如何最终处理请求。

答案 8 :(得分:0)

您是否考虑过使用某种版本控制系统来处理这个问题?您可以利用其计算和发送文件差异的能力,并获得维护文件版本历史记录的额外好处。

答案 9 :(得分:0)

由于我不知道你的情况的细节,我会在那里提出问题。仅仅为了争论,它必须是HTTP吗? FTP更适合大数据传输,可以通过PHP或Perl轻松实现自动化。

答案 10 :(得分:0)

如果您使用的是Apache,您可能还会考虑使用Apache mod_gzip。这应该允许你自动压缩文件,并且解压缩也应该自动发生,只要双方接受gzip压缩。