我正在尝试编写一个脚本来读取远程站点地图.xml并解析其中的网址,然后依次加载每个站点以预缓存它们以加快浏览速度。
这背后的原因是:我们正在开发的系统将DITA XML动态写入浏览器,第一次加载页面时,等待时间可能在8-10秒之间。之后的后续加载可能短至 1 秒。显然,为了更好的用户体验,预缓存页面是一个奖励。
每次我们在此服务器上准备新出版物或执行任何测试/修补时,我们都必须清除缓存,因此我们的想法是编写一个脚本,该脚本将通过站点地图解析并加载每个URL。
在做了一些阅读之后,我决定最好的途径是使用PHP和Curl。我不知道这是否是一个好主意。我对Perl更熟悉,但目前系统上都没有安装PHP和Perl,所以我认为将脚趾浸入PHP池可能会很好。
到目前为止,我从"互联网"中获取的代码读取站点地图.xml并将其写入我们服务器上的xml文件,并将其显示在浏览器中。据我所知,这只是一次性转储整个文件?
<?php
$ver = "Sitemap Parser version 0.2";
echo "<p><strong>". $ver . "</strong></p>";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'http://ourdomain.com/sitemap.xml;jsessionid=1j1agloz5ke7l?id=1j1agloz5ke7l');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$xml = curl_exec ($ch);
curl_close ($ch);
if (@simplexml_load_string($xml)) {
$fp = fopen('feed.xml', 'w');
fwrite($fp, $xml);
echo $xml;
fclose($fp);
}
?>
与其将整个文档转储到文件或屏幕上,不如遍历 xml 结构并获取我需要的 url。
XML 采用以下格式:
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9	http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
<url>
<loc>http://ourdomain.com:80/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4</loc>
<lastmod>2011-03-31T11:25:01.984+01:00</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
<url>
<loc>http://ourdomain.com:80/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_9</loc>
<lastmod>2011-03-31T11:25:04.734+01:00</lastmod>
<changefreq>monthly</changefreq>
<priority>1.0</priority>
</url>
我尝试过使用SimpleXML:
curl_setopt($ch, CURLOPT_URL, 'http://onlineservices.letterpart.com/sitemap.xml;jsessionid=1j1agloz5ke7l?id=1j1agloz5ke7l');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data = curl_exec ($ch);
curl_close ($ch);
$xml = new SimpleXMLElement($data);
$url = $xml->url->loc;
echo $url;
这打印了第一个到屏幕上的URL,这是个好消息!
http://ourdomain.com:80/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4
我的下一步是尝试阅读文档中的所有位置,所以我尝试:
foreach ($xml->url) {
$url = $xml->url->loc;
echo $url;
}
希望这会抓取 url 中的每个 loc,但它什么也没产生,我被卡住了。
请有人指导我抓住多个父母的孩子,然后加载此页面并缓存它的最佳方法,我认为这是一个简单的 GET?
我希望我提供了足够的信息。如果我错过了任何东西(除了实际编写PHP的能力,请说;-)
谢谢。
您似乎没有任何值来保存 foreach 的结果:
foreach ($xml->url as $url_list) {
$url = $url_list->loc;
echo $url;
}
你不需要使用 curl,使用 simplexml_load_file($sitemap_URL)
...或者使用 simplexml_load_string() 与 file_get_contents() 和 stream_context_create(),用于比 GET 更复杂的内容。
。并且不需要 DOM 遍历。
用一行解析为数组!
正如 http://www.sitemaps.org/protocol.html XML 描述的那样,它是一个具有良好数组表示形式的简单树。
您可以使用 json XML 读取器,
$array = json_decode(json_encode(simplexml_load_file($sitemap_URL) ), TRUE);
所以使用例如。 foreach($array['image:image'] as $r)
遍历它(通过var_dump($array)
检查)...另请参阅 OOP5.iterations。
PS:你也可以在 simplexml 上通过 XPath 做一个上一个节点选择。
您也可以使用 PHP Simple Large XML Parser (http://www.phpclasses.org/package/5667-PHP-Parse-XML-documents-and-return-arrays-of-elements.html),主要用于站点地图大小太大的情况。