Php 存储大型XML数据的最佳位置

Php 存储大型XML数据的最佳位置,php,xml,apache,Php,Xml,Apache,我正在从事一个项目,在这个项目中,xml提要通过cron作业从另一台服务器获取到我的服务器并保存为文件,我的网站使用该xml文件在网站上显示数据 但问题是,xml文件大约有两个大文件(4mb),每次用户访问站点时,服务器都会获取该文件(从同一位置)并对其进行解析,然后将其发送给用户,因此,如果点击1000次,服务器就会将其发送1000次(这是我想要解决的开销) 我尝试使用memcache,但也被限制为2mb 有谁能告诉我,将大xml保存在DB、xml文件或memcache中的最佳方法是什么?我应

我正在从事一个项目,在这个项目中,xml提要通过cron作业从另一台服务器获取到我的服务器并保存为文件,我的网站使用该xml文件在网站上显示数据

但问题是,xml文件大约有两个大文件(4mb),每次用户访问站点时,服务器都会获取该文件(从同一位置)并对其进行解析,然后将其发送给用户,因此,如果点击1000次,服务器就会将其发送1000次(这是我想要解决的开销)

我尝试使用memcache,但也被限制为2mb


有谁能告诉我,将大xml保存在DB、xml文件或memcache中的最佳方法是什么?我应该将大xml划分为不同的类别吗?

您可以实现一个本机PHP缓存系统,它没有Memcached那样的内存限制,请阅读以下内容:

我将创建一个数据库,让cron作业获取,然后解析XML并将所有内容插入数据库,并且只为数据库中的用户提供服务


为了确保数据的一致性,您可以实施基本的版本控制。将当前版本号存储在某处;每当您获得一个新的XML时,将下一个版本存储到数据库中,然后更新当前版本号,定期清理。

对4MB数据使用memcache不是一个好的选择,而且您已经遇到了XML文件的问题。正如@ori所回答的,更好的选择是将xml数据存储到某个数据库中,并从数据库中为用户提供服务。
查找此链接,以了解如何将XML加载到数据库。

还有一点,如果您将此XML作为web服务(如SOAP)获取,那么应该有一个仅获取更新数据的选项。这样,你也可以节省一些下载时间。

你应该考虑28毫秒来存储XML数据:

但问题是,xml文件大约有两个大文件(4mb),每次用户访问站点时,服务器都会获取该文件(从同一位置)并对其进行解析,然后将其发送给用户,因此,如果点击1000次,服务器就会将其发送1000次(这是我想要解决的开销)

因此,您已经缓存了网络访问,但到目前为止还没有缓存解析。为什么不缓存解析呢?!这将减少显示结果所需的时间,因为XML没有更改,解析也没有更改


如果仍然太慢,您可以期待下一步提高速度的地方,例如缓存每个类别等。由于您没有显示任何代码,也没有概述如何处理数据,因此无法给出更多建议。

新的xml提要将在每3到10分钟后提取一次,并替换旧的xml提要,具体取决于xml提要的内容。如果它是一个包含类别的产品提要,那么您可以在按类别检索后将其拆分为较小的文件。或者,让一个脚本将xml解析到一个数据库中,这样可以让您对检索的内容有更多的选择。您使用的是什么类型的内容?非常大的产品xml(大约4mb的文件)在打开时会在浏览器中挂起一段时间,问题是类别一直在变化,即使我将xml拆分为块,它也会很大,因此将其存储到db中是否可行,每一行将以千字节为单位。为什么不将xml保存到本地文件中,然后每1小时、2小时等更新一次xml。感谢大家,我应该将它保存到db中吗?即使一个表行非常大(以千字节为单位)?服务器用于记录,并且每3到5分钟刷新一次xml,所以将每一行用于每个产品都保存到db中不是一个好主意。是否适合将每个类别的xml保存到db行中,比如一个类别保存一行,那么每行将保存KBXML中的数据,每个xml文件大约有60000行。将内容拆分成不同的表并插入数据库似乎是个不错的主意,但假设我每天有1000个xml文件。将所有内容转储到一个大字段中,然后将该文本/字符串解析为xml文件,并在每次用户查询时返回结果,怎么样。我知道每次解析如此巨大的数据都会产生额外的开销,但它确实解决了数据库行数的限制。在这两个选项中,最好的选项是什么?如果我在每一行中插入这些值,行数是否会用完。不,只是xml没有soap响应我没有缓存任何东西,我只是将xml保存在服务器上,当有人点击服务器获取记录时对其进行解析,此外,xml每3到5分钟刷新一次,因此将每种产品的每一行保存到db中不是一个好主意。是否适合将每个类别的xml保存到db行中,比如一个类别保存一行,然后每行将保存KB中的数据,就像您已经做的那样将xml存储在光盘上:我将它称为缓存,因为它缓存网络访问。这是一个基于文件的缓存。添加一个额外的缓存是有意义的(比如像您建议的那样,通过按类别将解析存储到DB中来缓存解析)。根据您所做的工作,将数据库中的每个条目保持为规范化形式甚至是有意义的,这样您就可以在站点被访问时进行简单的数据库查询。如果仍然太慢,您甚至可以将DB查询缓存几分钟。这一切都取决于您所做的,从耗时最长的部分开始,以使缓存最有效。