Как разобрать карту сайта xml с помощью PHP Curl и загрузить каждый URL отдельно - PullRequest
6 голосов
/ 12 мая 2011

Я пытаюсь написать скрипт, который будет читать удаленный файл sitemap.xml и анализировать URL-адреса внутри него, а затем загружать каждый из них по очереди, чтобы предварительно кэшировать их для более быстрого просмотра.

Причина этого: Система, которую мы разрабатываем, записывает DITA XML в браузер на лету, и при первой загрузке страницы время ожидания может составлять 8-10 секунд.Последующие нагрузки после этого могут составлять всего 1 секунду.Очевидно, что для лучшего UX предварительно кэшированные страницы являются бонусом.

Каждый раз, когда мы готовим новую публикацию на этом сервере или проводим любое тестирование / исправление, мы должны очистить кэш, поэтому идея состоит в том, чтобы написатьСкрипт, который будет анализировать карту сайта и загружать каждый URL.

После небольшого чтения я решил, что лучший способ - использовать PHP и Curl.Является ли это хорошей идеей или нет, я не знаю.Я более знаком с Perl, но в настоящее время в системе не установлены ни PHP, ни Perl, поэтому я подумал, что было бы неплохо погрузить мои пальцы в пул PHP.

Код, который я собрал в интернете"до сих пор читает 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);
}
?>

Вместо того, чтобы выгрузить весь документ в файл или на экран, было бы лучше пересмотреть структуру 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>

Я пробовал использовать 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;
}

надеясь, что это захватит каждый loc в URL, но это ничего не даст, и вот я застрял.

Пожалуйста, кто-нибудь может подсказать мне, как захватить ребенка от нескольких родителей, а затем лучший способ загрузить эту страницу и кэшировать ее, котораяя предполагаю, это простой GET?

Я надеюсь, что предоставил достаточно информации.Если я что-то упустил (кроме возможности написать PHP. Пожалуйста, скажите; -)

Спасибо.

Ответы [ 3 ]

11 голосов
/ 12 мая 2011

У вас нет значения для сохранения результата foreach:

foreach ($xml->url as $url_list) {
    $url = $url_list->loc;
    echo $url;
}
3 голосов
/ 06 октября 2016

Вам не нужно использовать 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 reader ,

$array = json_decode(json_encode(simplexml_load_file($sitemap_URL) ), TRUE);

Так что используйте например. foreach($array['image:image'] as $r) чтобы пройти его (проверьте var_dump($array)) ... см. Также oop5.iterations .

PS: вы также можете сделать предыдущий выбор узла с помощью XPath по адресу simplexml.

1 голос
/ 28 сентября 2013

Вы также можете использовать PHP Simple Large XML Parser (http://www.phpclasses.org/package/5667-PHP-Parse-XML-documents-and-return-arrays-of-elements.html) в основном в том случае, если размер карты сайта слишком велик.

...