Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/244.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何避免多次重新加载XML文档?_Php_Javascript_Xml - Fatal编程技术网

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

Php 如何避免多次重新加载XML文档?,php,javascript,xml,Php,Javascript,Xml,tl;dr:我想加载一个XML文件一次,然后反复使用它 我有一点javascript,它向一个PHP页面发出ajax请求,该页面收集并解析一些XML,然后返回显示,比如说,有4000个节点,PHP将结果分页为100个块,您将有40个页面的数据。如果有人单击最初加载的页面之外的其他页面,那么会发出另一个请求,PHP会加载那个大XML文件,获取索引子集,如记录200-299,并返回它们以供显示。我的问题是,有没有一种方法可以只加载一次XML文件,然后反复使用它 每个ajax请求的处理过程如下: -加

tl;dr:我想加载一个XML文件一次,然后反复使用它

我有一点javascript,它向一个PHP页面发出ajax请求,该页面收集并解析一些XML,然后返回显示,比如说,有4000个节点,PHP将结果分页为100个块,您将有40个页面的数据。如果有人单击最初加载的页面之外的其他页面,那么会发出另一个请求,PHP会加载那个大XML文件,获取索引子集,如记录200-299,并返回它们以供显示。我的问题是,有没有一种方法可以只加载一次XML文件,然后反复使用它

每个ajax请求的处理过程如下: -加载xml文件simplexml\u加载文件 -使用xpath解析出所需的位 -使用LimitIterator获取我需要的特定索引集 -还那一套

当有人请求不同的分页结果时,我希望它是: -如果需要,对我在上一次请求重新分析中加载的数据使用LimitIterator -还那一套


看来是的,对吧?每次访问XML文件都是一种巨大的浪费。我该如何抓取并持久化它,以便不同的分页请求不必每次都重新加载文件

我相信最接近你的是


不过,我不会担心它,特别是如果它是本地文件。像include这样的操作相当便宜。

我相信最接近您的是


不过,我不会担心它,特别是如果它是本地文件。include-like操作相当便宜。

能否将其加载到$\u会话数据中?还是会因为区块的大小而耗尽内存?

能否将其加载到$\u会话数据中?还是会因为区块的大小而耗尽内存?

只要让服务器根据用户输入和反馈读取和解析分页文件即可。这意味着它可以缓存在服务器上,比客户端下载和缓存整个XML文档要快得多。在向用户显示数据之前,请使用PHP、Perl、ASP或其他工具对数据进行分页。

只要让服务器根据用户输入和反馈对分页文件进行读取和解析即可。这意味着它可以缓存在服务器上,比客户端下载和缓存整个XML文档要快得多。在向用户显示数据之前,请使用PHP、Perl、ASP或其他工具对数据进行分页。

对于每次命中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压缩,99%的浏览器都支持gzip压缩,您甚至可以将其保存为压缩后的文件并按原样使用。

如果每次都要解析那个大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压缩,您甚至可以将其保存为压缩文件并按原样提供。99%的浏览器都支持gzip压缩,否则就可以动态对其进行解压缩。

加载的是simplexml\u load\u文件,不像包含文件,加载数千条记录似乎不便宜。我来看看memcached能提供什么。加载的是simplexml\u load\u文件,不像include,加载数千条记录似乎不便宜。我会看看memcached能提供什么。但是$xml=get\u结果\u chunk$start;文件\u放置\u内容$cache\u文件,$xml;与我原来的:simplexml\u get\u文件相比,这是一个很大的改进;我不确定会是这样。我不知道simplexml\u get\u file函数做什么。通过缓存区块,下次请求时可以节省99%的处理时间。如果您愿意,您还可以在每次源文档更改时一次预切全部40个块;文件\u放置\u内容$cache\u文件,$xml;与我原来的:simplexml\u get\u文件相比,这是一个很大的改进;我不确定会不会。我不知道是什么 您的simplexml\u get\u file函数不支持。通过缓存区块,下次请求时可以节省99%的处理时间。如果愿意,您还可以在每次源文档更改时一次预切整个40个块。