Comment analyser un sitemap xml à l'aide de PHP Curl et individuellement la charge de chaque url
Je suis en train d'écrire un script qui va lire une distance sitemap.xml et d'analyser l'url du sein, puis de charger chacun, tour à tour, avant de les mettre en cache pour une navigation plus rapide.
La raison derrière cela: 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 entre 8 à 10 secondes. Les chargements ultérieurs après que l'on peut être aussi peu que 1 seconde. Évidemment, pour une meilleure UX, pré-en cache-pages sont un bonus.
Chaque fois que nous nous préparons à une nouvelle publication sur ce serveur ou d'effectuer tout essai/de l'application des correctifs que nous avons pour effacer le cache donc l'idée est d'écrire un script qui va analyser le sitemap et de la charge de chaque url.
Après avoir fait un peu de lecture, j'ai décidé que le meilleur moyen est d'utiliser PHP & Curl. Si c'est une bonne idée ou pas je ne sais pas. Je suis plus familier avec Perl mais ni PHP, ni Perl installés sur le système à l'heure actuelle, alors j'ai pensé qu'il pourrait être agréable à tremper mes orteils dans le PHP de la piscine.
Le code que j'ai attrapé off "teh internets" jusqu'à présent, lit le sitemap.xml et l'écrit dans un fichier xml sur notre serveur, ainsi que l'affichage dans le navigateur. Aussi loin que je peux dire c'est tout simplement le dumping un 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 vider l'intégralité du document dans un fichier ou à l'écran, il serait préférable de parcourir la structure xml et il suffit de saisir l'url que 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	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 cet imprimé de la première url de l'écran qui a été une super nouvelle!!
http://ourdomain.com:80/content/en/FAMILY-201103311115/Family_FLJONLINE_FLJ_2009_07_4
Ma prochaine étape est d'essayer et de lire toutes les lignes de crédit dans le document, donc j'ai essayé:
foreach ($xml->url) {
$url = $xml->url->loc;
echo $url;
}
espérant que ce serait prendre chaque loc au sein de l'url, mais il produit rien et là je suis coincé.
Svp quelqu'un pourrait-il me guider vers l'accaparement l'enfant de plusieurs parents et puis la meilleure façon de charger cette page et de les mettre en cache qui je suppose est un moyen simple d'OBTENIR?
J'espère avoir fourni assez d'informations. Si je suis absent quelque chose (en dehors de la possibilité d'écrire des scripts PHP. s'il vous plaît dire 😉
Grâce.
- (note) SimpleXml pouvez charger à distance Uri directement. Vous n'avez pas besoin de cURL pour que.
- Ok, je vais regarder dans cette grâce.
Vous devez vous connecter pour publier un commentaire.
Vous ne semble pas avoir de valeur pour contenir le résultat de la boucle foreach:
Avez-vous pas besoin d'utiliser curl, l'utilisation
simplexml_load_file($sitemap_URL)
... ou utiliser simplexml_load_string() avec file_get_contents() avec la fonction stream_context_create(), pour quelque chose de plus complexe que de se.... Et pas besoin DOM traverse.
Analyser sous forme de tableau avec une ligne!
Comme http://www.sitemaps.org/protocol.html XML de description, c'est un simple arbre avec une bonne matrice de représentation.
Vous pouvez utiliser un json XML reader,
Donc utiliser par exemple.
foreach($array['image:image'] as $r)
de la traverser (à vérifier parvar_dump($array)
)... voir aussi oop5.itérations.PS: vous pouvez aussi faire un nœud précédent sélection par XPath à simplexml.
Vous pouvez également utiliser PHP Simple Grand XML Parser (http://www.phpclasses.org/package/5667-PHP-Parse-XML-documents-and-return-arrays-of-elements.html) principalement dans les cas où la taille de sitemap est trop grand.