如何避免多次重新加载XML文档?

时间:2010-01-29 05:14:44

标签: php javascript xml

tl; dr :我想加载一次XML文件并一遍又一遍地重复使用。

我有一些javascript对PHP页面发出ajax请求,该页面收集并解析一些XML并将其返回以供显示(例如,有4,000个节点,并且PHP将结果分页为100块你将拥有的块40“页”的数据)。如果有人点击其中一个页面(除了最初加载的那个页面之外)然后发出另一个请求,PHP就会加载那个大的XML文件,抓取那个索引子集(比如记录200-299)并返回它们进行显示。我的问题是,有没有办法只加载一次XML文件,只是一遍又一遍地重复使用?

每个ajax请求的过程是:
     - 加载xml文件(simplexml_load_file())
     - 解析所需的位数(使用xpath)
     - 使用LimitIterator来获取我需要的特定索引集      - 返回那套

当有人要求不同的分页结果时我想要的是:      - 对我在上一个请求中加载的数据使用LimitIterator(如果需要,可以重新分析)
     - 返回那套

似乎(它是,对吗?)每次点击XML文件都是一个巨大的浪费。我将如何抓住并坚持下去,以便不同的分页请求不必每次都重新加载文件?

4 个答案:

答案 0 :(得分:2)

让您的服务器根据用户输入和反馈来读取和解析分页文件。这意味着它可以比在客户端下载和缓存整个XML文档时更快地缓存在服务器上。使用PHP,Perl,ASP或者在将数据显示给用户之前将其分页。

答案 1 :(得分:1)

我相信你最接近的是Memcached

虽然,我不担心它,特别是如果它是本地文件。 include类似的操作相当便宜。

答案 2 :(得分:1)

问题“每次点击XML文件都是一个巨大的浪费”然后回答是肯定的,如果你每次必须解析那个大的XML文件。据我所知,您希望保存用户感兴趣的块,这样您就不必每次都这样做。一个非常简单的文件缓存怎么样?无需扩展,快速,易于使用和维护。这样的事情:

function echo_results($start)
{
    // IMPORTANT: make sure that $start is a valid number
    $cache_file = '/path/to/cache/' . $start . '.xml';
    $source     = '/path/to/source.xml';
    $mtime      = filemtime($cache_file);

    if (file_exists($cache_file)
     && filemtime($cache_file) < $mtime)
    {
        readfile($cache_file);
        return;
    }

    $xml = get_the_results_chunk($start);
    file_put_contents($cache_file, $xml);

    echo $xml;
}

作为额外的好处,您可以使用源文件的上次修改时间,以便自动忽略比源文件旧的缓存块。

如果客户端支持gzip压缩(IOW,99%的浏览器),你甚至可以将其保存为压缩并按原样提供,否则即可解压缩。

答案 3 :(得分:0)

您可以将其加载到$ _SESSION数据中吗?或者由于块的大小会破坏内存?

相关问题