如何使用PHP Curl解析xml站点地图并单独加载每个URL

Hed*_*ips 6 php curl simplexml

我正在尝试编写一个脚本,该脚本将读取远程sitemap.xml并解析其中的url,然后依次加载每个脚本以预先缓存它们以便更快地浏览.

背后的原因:我们正在开发的系统在运行时将DITA XML写入浏览器,并且第一次加载页面时,等待时间可能在8-10秒之间.之后的后续加载可能只需1秒.显然,对于更好的用户体验,预先缓存的页面是一个奖励.

每次我们在此服务器上准备新发布或执行任何测试/修补时,我们都必须清除缓存,以便编写一个脚本来解析站点地图并加载每个URL.

在做了一些阅读后,我认为最好的路线是使用PHP和Curl.这是不是一个好主意我不知道.我对Perl更熟悉,但目前系统上既没有安装PHP也没有Perl,所以我觉得在PHP池中蘸我的脚趾可能会很好.

到目前为止,我抓住"teh internets"的代码读取了sitemap.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);
}
?>
Run Code Online (Sandbox Code Playgroud)

而不是将整个文档转储到文件或屏幕中,最好遍历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&#x9;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>
Run Code Online (Sandbox Code Playgroud)

我尝试过使用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;
Run Code Online (Sandbox Code Playgroud)

这打印了第一个网址到屏幕,这是个好消息!

http://ourdomain.com:80/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4

我的下一步是尝试阅读文档中的所有loc,所以我尝试了:

foreach ($xml->url) {
    $url = $xml->url->loc;
    echo $url;
}
Run Code Online (Sandbox Code Playgroud)

希望这会抓住网址中的每个位置,但它什么都没产生,在这里我被卡住了.

请有人指导我抓住多个父母的孩子然后加载这个页面的最佳方式并缓存它我假设是一个简单的GET?

我希望我提供了足够的信息.如果我遗漏任何东西(除了实际编写PHP的能力.请说;-)

谢谢.

ont*_*ia_ 11

您似乎没有任何值来保存foreach的结果:

foreach ($xml->url as $url_list) {
    $url = $url_list->loc;
    echo $url;
}
Run Code Online (Sandbox Code Playgroud)

  • 哦,当你知道如何简单!谢谢. (2认同)

Pet*_*uss 6

simplexml_load_file($sitemap_URL)对于比 GET 更复杂的事情,您不需要使用 curl、使用... 或使用 simplexml_load_string() 和 file_get_contents() 和 stream_context_create()。

... 并且不需要 DOM 遍历。

用一行解析为数组!

正如http://www.sitemaps.org/protocol.html XML 描述,它是一个简单的树,具有良好的数组表示。

您可以使用json XML 阅读器

$array = json_decode(json_encode(simplexml_load_file($sitemap_URL) ), TRUE);
Run Code Online (Sandbox Code Playgroud)

所以使用例如。foreach($array['image:image'] as $r)遍历它(检查var_dump($array))...另见oop5.iterations

PS:您也可以在 simplexml 中通过 XPath 进行先前的节点选择。