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文件都是一个巨大的浪费。我将如何抓住并坚持下去,以便不同的分页请求不必每次都重新加载文件?
答案 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数据中吗?或者由于块的大小会破坏内存?