2008-10-29 147 views
2

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

谢谢!

回答

4

根据你的用例,我肯定会建议先压缩数据。另外,你可能需要md5散列文件并在开始下载之前比较它(如果文件没有变化,则不需要更新),这将有助于点#2。

也有可能只发送一段XML而不是整个文件?

+0

发送细分将是一个好主意,它绝对可行。 – CoolGravatar 2008-10-29 20:01:17

+0

太好了,我建议散列整个文件两端,并在启动传输之前比较散列。如果有更新,只需发送段(如上所述,gzip),然后将其拼接到“客户端”。如果你不绑定到XML,也许更轻的解决方案(json?)可能更好 – Owen 2008-10-29 21:15:04

0

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

在我看来,发布大文件存在浏览器超时问题等问题,但与正在尝试不同的文件上传协议相比,它更适用于代理服务器和防火墙。

+0

浏览器不应该有问题,我使用HTTP在过去将3GB文件上传到我的一个应用程序。它花了大部分时间,但到最后。 – Ady 2008-10-29 18:49:07

0

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

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

其他想法?

+0

首先你说XML可以增长到GB,现在你说“最多几分钟”。你不能这样做。 – 2008-10-29 21:06:47

2

考虑到XML是用PHP动态创建的,我能想到的最简单的事情就是确保该文件由web服务器自动进行gzip压缩,如描述here,它提供了一种通用的PHP方法和Apache httpd-具体解决方案除此之外,拥有一个浏览器(还有什么可以是PHP客户端?)每天晚上都会做这样的工作,因为某些数据会同步化声音,就像在其他地方必须有一个更简单的解决方案。

,当然,在某些时候,转移“很多”的数据是要采取时间“很多” ......

+0

“还有什么可以成为PHP客户端?”另一台服务器 - 如本地运行的soapclient = P – 2008-10-29 21:22:25

+0

,php将能够通过CLI下载文件,这可以作为cron作业添加。 – nickf 2008-10-30 00:53:01

0

有没有我可以适用于压缩XML的算法?在几秒钟内如何下载MP3等大文件?

+0

这完全是另一回事,这取决于你的服务器的上传速度和用户(或你的其他机器)的下载速度,当然还有所有的随机管子:) – Owen 2008-10-29 21:13:19

0

PHP接收GB的数据将花费很长时间并且是开销。 更明显的缺陷。

我会 - 将任务分配给一个不受执行时间和失败困扰的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轻松实现自动化。

1

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

您需要a)将数据集A的更改的差异日志保留为您可以将该日志发送到数据集B的时间,或者b)保留数据集的两个副本(昨晚和当前数据集),然后将它们进行比较,以便将差分日志从A发送到B.

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

(b)的问题是整个“比较数据库”一次。罚款100行。 10^9行不好。讨厌的讨厌。

事实上,它可能都是讨厌的。复制是讨厌的。

一个更好的计划是查看为您正在运行的特定数据库(假设您正在运行数据库)设计的“真实”复制系统。可能会发送数据库日志记录以进行同步,而不是尝试自己推出。

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

0

如果你使用Apache,你也可以考虑使用Apache mod_gzip。这应该允许您自动压缩文件,并且解压缩也应该自动进行,只要双方都接受gzip压缩。