6 votes

Comment analyser un plan de site xml à l'aide de PHP Curl et charger individuellement chaque url ?

J'essaie d'écrire un script qui lira un sitemap.xml distant et analysera les url qu'il contient, puis chargera chacune d'entre elles tour à tour pour les précacher afin d'accélérer la navigation.

La raison de cette situation : Le système que nous développons écrit DITA XML dans le navigateur à la volée et la première fois qu'une page est chargée, l'attente peut être de 8 à 10 secondes. Les chargements suivants ne durent qu'une seconde. Évidemment, pour une meilleure expérience utilisateur, les pages mises en cache sont un bonus.

Chaque fois que nous préparons une nouvelle publication sur ce serveur ou que nous effectuons un test/Parcheando, nous devons vider le cache. L'idée est donc d'écrire un Parcheando qui va parcourir le sitemap et charger chaque url.

Après avoir lu un peu, j'ai décidé que la meilleure solution était d'utiliser PHP et Curl. Je ne sais pas si c'est une bonne idée ou non. Je suis plus familier avec Perl, mais ni PHP ni Perl ne sont installés sur le système actuellement, alors j'ai pensé que ce serait bien de tremper mes orteils dans la piscine de PHP.

Le code que j'ai récupéré sur "teh internets" jusqu'à présent lit le sitemap.xml et l'écrit dans un fichier xml sur notre serveur et l'affiche dans le navigateur. D'après ce que j'ai compris, il s'agit simplement d'envoyer le fichier entier en une seule fois ?

<?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);
}
?>

Plutôt que de déverser l'ensemble du document dans un fichier ou sur l'écran, il serait préférable de parcourir la structure xml et de saisir simplement l'url dont j'ai besoin.

Le xml est dans ce format :

<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>

J'ai essayé d'utiliser 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;

et cela a imprimé la première url à l'écran, ce qui est une bonne nouvelle !

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

L'étape suivante consistait à essayer de lire toutes les sections du document, et j'ai donc essayé :

foreach ($xml->url) {
    $url = $xml->url->loc;
    echo $url;
}

J'espérais que cela permettrait de saisir chaque localité dans l'url, mais cela n'a rien donné et je suis coincé.

Quelqu'un pourrait-il me guider vers la saisie de l'enfant de plusieurs parents et ensuite vers la meilleure façon de charger cette page et de la mettre en cache, ce qui, je suppose, est un simple GET ?

J'espère avoir fourni suffisamment d'informations. S'il me manque quelque chose (à part la capacité d'écrire du PHP), dites-le moi ;-)

Gracias.

11voto

onteria_ Points 18947

Vous ne semblez pas avoir de valeur pour contenir le résultat du foreach :

foreach ($xml->url as $url_list) {
    $url = $url_list->loc;
    echo $url;
}

6voto

Peter Krauss Points 1888

Vous n'avez pas besoin d'utiliser curl, utilisez simplexml_load_file($sitemap_URL) ... ou utiliser simplexml_load_string() avec file_get_contents() avec stream_context_create(), pour quelque chose de plus complexe que GET.

... Et ne pas avoir besoin de traverser le DOM.

Parse comme un tableau avec une seule ligne !

En http://www.sitemaps.org/protocol.html Description XML, c'est un arbre simple avec une bonne représentation des tableaux.

Vous pouvez utiliser un lecteur json XML ,

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

Utilisez donc eg. foreach($array['image:image'] as $r) pour le traverser (contrôle par var_dump($array) )... voir aussi oop5.itérations .

PS : vous pouvez également faire une sélection de nœuds précédents par XPath à simplexml.

1voto

Vous pouvez également utiliser l'analyseur XML simple et large de PHP ( http://www.phpclasses.org/package/5667-PHP-Parse-XML-documents-and-return-arrays-of-elements.html ) principalement dans le cas où la taille du sitemap est trop importante.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X