【问题标题】:PHP - simpleXml_load_file, simplexml_load_string, or conversion to array or cachePHP - simpleXml_load_file、simplexml_load_string 或转换为数组或缓存
【发布时间】:2014-04-14 23:51:47
【问题描述】:

关于开销、内存消耗、资源使用和代码处理的难易程度,解析大型 XML 文件的首选方法是什么?

  1. simpleXml_load_file
  2. simplexml_load_string
  3. 将 simpleXML 对象转换为数组
  4. 将 simpleXML 转换为缓存

我正在使用 simpleXML 解析一个非常大的 XML 文档,该文档将返回用户请求的相关搜索结果。

$XMLproducts = simplexml_load_file("products.xml");

除了最终生成请求的搜索结果外,simpleXML 请求还将生成链接以进一步细化获得的搜索结果……

foreach($XMLproducts->product as $Product) {
if ($user_input_values == $applicable_xml_values) {
// all refined search filter links produced here, then displayed later
$refined_search_filter_Array1[] = URL code + (string)$Product->applicable_variable;
$refined_search_filter_Array2[] = URL code + (string)$Product->applicable_variable2;
}

...以及帮助生成搜索结果页面(因为每页将有 20 个搜索结果)。

foreach($XMLproducts->product as $Product) {
//coding to produce pages number links for the search results pages number
}

然后我们最终得到用户请求的实际搜索结果:

foreach($XMLproducts->product as $Product) {
if ($user_input_values == $applicable_xml_values) {
echo $Product->name ……    
}}

由于用户可以点击多个细化的搜索过滤器链接以及页码链接以转到下一个搜索结果页面,因此将初始 simpleXML 请求转换为数组或进入缓存直到用户完成使用搜索结果?这样,当用户单击优化的搜索过滤器链接或单击链接以转到下一个搜索结果页面时,他/她将访问数组或缓存以执行此操作,而不是加载整个 XML 文件(使用另一个 simpleXML 请求)这样做。

感谢您的建议。

【问题讨论】:

  • 你到底想缓存什么?
  • 另外,XML 文件有多大?有多少用户同时请求该文件?
  • 我想缓存从 simpleXML 请求中检索到的结果中的值。 XML 文件大约有 6MB,并且有增长的潜力。我相信只有一个用户可以每 2 秒调用一次 API。

标签: php xml arrays caching simplexml


【解决方案1】:

四个都不是。

它们都是相同方法的变体:智能处理器在内存中创建具有完整数据集的复杂数据结构。你甚至没有尝试不同的智能处理器,只有simpleXML。 PHP 中唯一可扩展的 XML 库是 XMReader,假设您使用它编写的代码顺序读取数据、获取所需的内容并丢弃其余部分。但当然,这一切都是有代价的:为更多的编码工作提供更好的性能。

【讨论】:

  • 是的!我发现我将不得不学习如何使用 XMLReader 或 SAX。可能会使用 XMLReader 来检索 XML,然后使用 simpleXML 来显示它。谢谢!
【解决方案2】:

假设大型 XML 文件不经常更改。

然后我会建议您创建大 XML 文件的块并将它们分开存储。并且每次更新大 XML 文件时 - 重复将其拆分为多个部分的过程。

从大文件 - 只保留结构,以便您仍然可以浏览它。当用户离开主文件并转到某个分支时 - 加载相应的较小部分..

<Products>
    <Clothes> - into separate XML file
    <Cars> - into separate XML file
    <Computers> - into separate XML file

这样,您所做的每个请求 - 您都不必加载大文件,从而节省内存。

但是,如果用户的每个操作都可以更改文件——你必须使用数据库,否则你无法保证数据的有效性——每 2 秒就有一个新请求进来,而你不能确保它适用于最新记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-08-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 2013-09-25
    • 2013-10-11
    • 2021-04-16
    相关资源
    最近更新 更多