Хобрук: Ваш путь к мастерству в программировании

Динамическое создание карты сайта с помощью PHP

Я пытаюсь создать действительную карту сайта с помощью php. Логика проста. Я перенаправил все запросы ^ (. +) Index_sitemal.xml в мой файл index_sitemap.php в .htaccess. Сценарий PHP ниже:

<?php 
header( "content-type: application/xml; charset=UTF-8" );
    echo '<?xml version="1.0" encoding="UTF-8"?>'."\n";
    echo '<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'."\n";
    $len = 10;   // to take
    $min = 50;  // minimum
    $max = 100;  // maximum
    $range = [];
    foreach (range(0, $len - 1) as $i) {
        while(in_array($num = mt_rand($min, $max), $range));
        $range[] = $num;
        echo '<sitemap><loc>http://'.$_SERVER['SERVER_NAME'].'/sitemap/'.$num.'.xml</loc></sitemap>'."\n";
    }
    echo '</sitemapindex>';
?>

В браузере отображается хорошо.

Ссылка на изображение - (извините, низкая репутация) https://i.ibb.co/4ZmLJ1D/Screenshot-at-Jan-29-10-47-01.png

Но при попытке проверить xml я получаю ошибку типа.

Ссылка на изображение - (извините, низкая репутация) https://i.ibb.co/Ws11cBj/Screenshot-at-Jan-29-10-55-28.png

Есть ли способ отобразить динамическую карту сайта с помощью php?


Ответы:


1

У меня была аналогичная проблема раньше, но я решил ее, запустив другой файл PHP для обновления карты сайта с помощью задания CRON.

<?php
$xmlString = '<?xml version="1.0" encoding="UTF-8"?>';
$xmlString .= '<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">';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/videos/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/contact/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$xmlString .= '<url>';
$xmlString .= '<loc>http://example.com/blog/</loc>';
$xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
$xmlString .= '<changefreq>daily</changefreq>';
$xmlString .= '<priority>1.0</priority>';
$xmlString .= '</url>';

$sql = "SELECT * FROM categories";
$stmt = DB::run($sql);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)){
    $url = $row["url"];
    $xmlString .= '<url>';
    $xmlString .= '<loc>http://example.com/category/'.htmlentities($url).'/</loc>';
    $xmlString .= '<lastmod>'.date(DATE_ATOM,time()).'</lastmod>';
    $xmlString .= '<changefreq>daily</changefreq>';
    $xmlString .= '<priority>1.0</priority>';
    $xmlString .= '</url>';
}

$xmlString .= '</urlset>';

$dom = new DOMDocument;
$dom->preserveWhiteSpace = FALSE;
$dom->loadXML($xmlString);

$dom->save('../sitemap.xml');
?>

Редактировать

<?php

$host = 'http://www.google.com/ping?sitemap=https://www.example.com/sitemap.xml'; 
$ch = curl_init($host);
curl_setopt($ch, CURLOPT_TIMEOUT, 5);
curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$data = curl_exec($ch);
$httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);
if($httpcode>=200 && $httpcode<300){
  echo 'success';
} else {
  echo 'try again';
}

?>
29.01.2019
  • Падди Халлихан, спасибо за ответ! Мне нужно настроить задание CRON, чтобы сначала его протестировать. Но не могли бы вы посоветовать, генерирует ли этот скрипт статический ../sitemap.xml или отображает его только без сохранения? 29.01.2019
  • Вы можете просто запустить файл PHP в своем браузере для тестирования, не настраивая задание cron, и он должен сохранить файл xml. В моем случае у меня есть папка cron со всеми скриптами, поэтому XML сохраняется обратно в основной каталог ../sitemap.xml, поэтому вам может потребоваться настроить это 29.01.2019
  • Фактический XML-файл при сохранении является статическим. Но задание CRON будет переписывать его каждый час / день или как хотите. 29.01.2019
  • Хм, странно, но я не получаю этот статический файл sitemap.xml. Но в любом случае я понял вашу точку зрения и продолжу в этом направлении, спасибо. Другое дело, как это отобразить. Я имею в виду, если я сохраню его $ dom- ›save ('../ sitemap.xml'); тогда мой скрипт php не будет возвращать карту сайта xml, как было изначально запланировано. 29.01.2019
  • Единственное, что я мог придумать в этом случае, - это, как я сказал ранее, подняться по каталогу с помощью ../ и убедиться, что у вас есть возможность писать в этот каталог. Также, когда он сохранен, мне не нужно его отображать. Я знаю, что имя всегда будет одинаковым, так что это URL-адрес, который я дал поисковой консоли Google. У меня также есть еще один скрипт в отдельном задании cron, который пингует Google, чтобы сказать: эй, вот новая карта сайта (см. Отредактированный ответ) 29.01.2019
  • Также, когда он сохранен, мне не нужно его отображать. Я знаю, что имя всегда будет одинаковым, так что это URL-адрес, который я дал поисковой консоли Google. - Верно, но у меня есть правило переадресации .htaccess. Поэтому мне нужна опция отображения, но я думаю, что CURL может сделать это с правильным заголовком. 29.01.2019
  • Ну ладно, возможно, вам придется что-то изменить для вашей конкретной настройки, но я все равно сделал это, надеюсь, это поможет 29.01.2019
  • Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..