Скрипт Sitemap-генератор XML

PHP - скрипт Sitemap-генератор XML создает XML карту сайта на основе уже известных URL сайта и данных о последней модификации, регулярности обновления страницы и ее приоритета (обязательно только наличие URL). Sitemap-генератор XML точно разделяет информацию по файлам, при достижении заданных лимитов по кол-ву URL-адресов или размеру файла (согласно спецификации sitemap.org в одном файле не более 50000 URL и его размер не более 10Mb). Функция может работать с большими объемами данных при минимальном расходе памяти и высокой скорости обработки информации - 300 000 URL обработано и записано за 25 сек (на сервере с процессором Xeon с использованием скрипта-примера, опубликованного ниже). По окончании работы можно просмотреть статистику по работе этой функции.

Функция sitemap_url_gen() приводит данные по каждому URL к XML формату. Обязательным параметром является только $url. В адресах страниц также заменяются некоторые символы на их аналоги, чтобы соответствовать стандартам XML. Если не указаны остальные параметры, то в XML карте сайта они не сохраняются.

sitemap_url_gen() - функция приведения данных по отдельноу URL к XML-формату
<?php
function sitemap_url_gen($url, $lastmod = '', $changefreq = '', $priority = '')
  {
  // http://petrenco.com/php.php?txt=119
  $search = array('&', '\'', '"', '>', '<');
  $replace = array('&amp;', '&apos;', '&quot;', '&gt;', '&lt;');
  $url = str_replace($search, $replace, $url);
  $lastmod = (empty($lastmod)) ? '' : '
    <lastmod>'
.$lastmod.'</lastmod>';
  $changefreq = (empty($changefreq)) ? '' : '
    <changefreq>'
.$changefreq.'</changefreq>';
  $priority = (empty($priority)) ? '' : '
    <priority>'
.$priority.'</priority>';
  $res = '
  <url>
    <loc>'
.$url.'</loc>'.$lastmod.$changefreq.$priority.'
  </url>'
;
  return $res;
  }
?>
  • $url - URL-адрес страницы, например: http://petrenco.com/php.php?txt=119
  • $lastmod - дата последней модификации страницы в формате YYYY-MM-DD (date('Y-m-d') - 2012-02-06)
  • $changefreq - как часто обновляется страница. Допустимые значения: always, hourly, daily, weekly, monthly, yearly, never.
  • $priority - приоритет страниц. Допустимые значения от наименьшего до наибольшего приоритета: 0.0 - 1.0

Функция sitemap_file_save() создает файл или несколько файлов sitemap.xml. Обратите внимание: перед созданием новых файлов sitemap функция удаляет все существующие файлы: sitemap.xml, sitemap1.xml, ..., sitemapXXX.xml. Также, в функции используются стандартные функции PHP mb_substr() и mb_strlen(). В случае, когда применяется кодировка отличная от UTF8 и др. многобайтовых кодировок, например win-1251, следует использовать аналогичные стандартные функции PHP: substr() и strlen().

sitemap_file_save() - функция создания файла(ов) sitemap.xml
<?php
function sitemap_file_save($data, $parm = array(), $max_url_in_file = 50000, $max_size_file = 10485760)
  {
  // http://petrenco.com/php.php?txt=119
  $parm['url_counter_all'] = 0;
  $sitemap_file_name = 'sitemap';
  $first_str = '<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">'
;
  $last_str = '
</urlset>'
;
 
  if (!isset($parm['fp']))
    {
    $parm['counter_files'] = (isset($parm['counter_files'])) ? $parm['counter_files'] : 1;
    $parm['cycling_protect'] = (isset($parm['cycling_protect'])) ? $parm['cycling_protect'] : 0;
    $parm['name_file'] = $sitemap_file_name.$parm['counter_files'].'.xml';
    if ($parm['counter_files'] == 1)
      {
      $parm['name_file'] = $sitemap_file_name.'.xml';
      $file_in_dir = scandir($_SERVER['DOCUMENT_ROOT']);
      $i = 0;
      $d_files = '';
      foreach ($file_in_dir AS $val)
        {
        if (preg_match('~^'.$sitemap_file_name.'[0-9]{0,5}\.xml$~', $val))
          {
          unlink($val);
          $d_files .= $val.', ';
          $i++;
          }
        }
      $d_files = mb_substr($d_files, 0, -2);
      $parm['log'][0] = 'Deleted '.$i.' file(s): '.$d_files.'.';
      }
     
    $parm['fp'] = fopen($parm['name_file'], "w");
       
    if (!$parm['fp'])
      exit('Cannot create file '.$name_file.'. Check access to file or parent directory.');
    else
      {
      fwrite($parm['fp'], $first_str);
      $parm['size_counter'] = mb_strlen($first_str.$last_str);
      }
    }
   
  $parm['size_counter'] = $parm['size_counter'] + mb_strlen($data);

  if ($parm['size_counter'] <= $max_size_file OR $parm['cycling_protect'] == 1)
    {
    fwrite($parm['fp'], $data);
    $parm['url_counter']++;
    $parm['cycling_protect'] = 0;
    }
  else
    {
    fwrite($parm['fp'], $last_str);
    fclose($parm['fp']);
    unset($parm['fp']);
    $parm['size_counter'] = $parm['size_counter'] - mb_strlen($data);
    $parm['log'][$parm['counter_files']]['file'] = $parm['name_file'];
    $parm['log'][$parm['counter_files']]['size'] = $parm['size_counter'];
    $parm['log'][$parm['counter_files']]['urls'] = $parm['url_counter'];
    $parm['log'][$parm['counter_files']]['end'] = 'exceeded size counter';
    $parm['counter_files'] ++;
    $parm['url_counter'] = 0;
    $parm['cycling_protect'] = 1;
    $parm = sitemap_file_save($data, $parm, $max_url_in_file, $max_size_file);
    return $parm;
    }
 
  if ($parm['url_counter'] >= $max_url_in_file OR $parm['end'])
    {
    $action_txt = ($parm['end']) ? 'end urls' : 'exceeded url counter';
    if (empty($data))
      $parm['url_counter']--;
    fwrite($parm['fp'], $last_str);
    fclose($parm['fp']);
    unset($parm['fp']);
    $parm['log'][$parm['counter_files']]['file'] = $parm['name_file'];
    $parm['log'][$parm['counter_files']]['size'] = $parm['size_counter'];
    $parm['log'][$parm['counter_files']]['urls'] = $parm['url_counter'];
    $parm['log'][$parm['counter_files']]['end'] = $action_txt;
    $parm['counter_files'] ++;
    $parm['url_counter'] = 0;
    }

  return $parm;
  }
  ?>

Входящие и выходящие значения:

  • $data - предварительно подготовленные XML данные по каждому URL функцией sitemap_url_gen()
  • $parm - массивы данных, необходимых для работы функции
    • $parm['end'] - флаг, сигнализирующий функции о необходимости завершения записи данных в файл. Обязательно передавать $parm['end'] = 1 после записи последнего URL:
    • $parm['url_counter'] - счетчик кол-ва URL для конкретного файла sitemap.xml;
    • $parm['url_counter_all'] - общий счетчик кол-ва всех URL;
    • $parm['counter_files']- подсчет кол-ва файлов;
    • $parm['fp'] - ссылка на открытый файл sitemap;
    • $parm['cycling_protect'] - переключатель для защиты от зацикливания.
    • $parm['log'] - статистические данные по работе функции, которые можно просмотреть при помощи функции, описанной ниже: sitemap_generator_log().
  • $max_url_in_file - максимально допустимое кол-во URL в 1 файле, по умолчанию: 50000 шт.;
  • $max_size_file - максимальный размер файла, по умолчанию 10485760 байт.

Функция sitemap_generator_log() формирует статистику отработки функции sitemap_file_save() в HTML формате.

sitemap_generator_log() - функция формирования статистики по работе функции sitemap_file_save()
<?php
function sitemap_generator_log($parm, $domain)
  {
  // http://petrenco.com/php.php?txt=119
  $ret = '';
  foreach ($parm['log'] AS $key => $val)
    {
    if ($key == 0)
      $ret = $val.'<br>';
    else
      $ret .= $key.' <a href="'.$domain.'/'.$val['file'].'" target="_blank">'.$val['file'].'</a>:  '.$val['size'].' байт; '.$val['urls'].' url. Окончание по событию: '.$val['end'].'.<br>';
    $sum_url = $sum_url + $val['urls'];
    $sum_s = $sum_s + $val['size'];
    }
  $ret .= '<strong>Всего: записано '.$sum_url.' urls, распределено по '.$key.' фалам суммарным размером '.round($sum_s / 1024).'Кб.</strong><br><br>';  
  return $ret;
  }
?>

Входящие данные для функции sitemap_generator_log().

  • $parm - результат работы функции sitemap_file_save();
  • $domain - домен с http://.

На выходе - отчет по созданию карты сайта в фалах sitemap.xml.

Ниже - скрипт для тестирования функций по созданию карты сайта в XML формате - sitemap.xml.

Скрипт тестирования функций по созданию карты сайта в XML
<?php

// UTF8
$test_url_generator = 100;

$domain = 'http://example.com';

$changefreq_arr = array('always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never');

$max_url_in_file = 35;

$max_size_file = 10000000;

for ($i = 1; $i <= $test_url_generator; $i++)
  {
  $url = $domain.'/php.php?text='.rand(1, ($test_url_generator * 5)).'&page='.rand(1,500);
  $lastmod = date('Y-m-d', time() + rand(-10000000, 10000000));
  $changefreq = $changefreq_arr[rand(0, 6)];
  $priority = '0.'.rand(0, 9);
 
  $xml_data = sitemap_url_gen($url, $lastmod, $changefreq, $priority);
 
  $parm = sitemap_file_save($xml_data, $parm, $max_url_in_file, $max_size_file);
  }

$parm['end'] = 1;
$xml_data = '';
$parm = sitemap_file_save($xml_data, $parm, $max_url_in_file, $max_size_file);

echo '<html>

<head>
  <title>Generator sitemap.xml</title>
  <meta charset="utf-8" />
</head>

<body>

'
.sitemap_generator_log($parm, $domain).'

</body>'
;

?>

// ТУТ НЕОБХОДИМО ВСТАВИТЬ КОД ТРЕХ ФУНКЦИЙ sitemap_url_gen(), sitemap_file_save() и sitemap_generator_log().

Использовать скрипт и функции, опубликованные в этой статье можно бесплатно по своему усмотрению в коммерческих и личных целях. Все вопросы по этому скрипту задавайте в комментариях к статье ниже.

Опубликовано: 2012/02/06
HTML-код ссылки на эту страницу:
<a href="https://petrenco.com/php.php?txt=119" target="_blank">Скрипт Sitemap-генератор XML</a>
38163
Комментарии
Всё бы ничего, но скрипт выдаёт ошибки.
И у сайта 80 стр., а он выдаёт 1000 url.
Скрипт протестирован - ошибок в нем нет - напишите какие именно ошибки выдает скрипт у Вас? Также этот скрипт рассчитан на интеграцию с "движком" сайта, т.е. скрипту необходимо передать то кол-во URL-адресов, которое Вы посчитаете за необходимое. Для каждого отдельного "движка" нужно написать скрипт, который будет выдавать все нужные URL сайта, а уже потом, с помощью моего скрипта Вы можете создать карту сайта.
работает нормально , то это че $imgd_cfg = $GLOBALS['imgd_cfg'];, а так спасибо!
да считает созданые урлы неправильно...
Строку с $imgd_cfg - убрал, спасибо. А на счет подсчета - при тестировании у меня все считалось правильно - проверьте, возможно ошибка где-то у Вас.
Также, в функции используются стандартные функции PHP mb_substr() и mb_strlen(). В случае, когда применяется кодировка отличная от UTF8 и др. многобайтовых кодировок, например win-1251, следует использовать аналогичные стандартные функции PHP: substr() и strlen().

И ЕЩЕ

http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=44538
им тож спасибо
Статья довольно старая, но, может, автор еще просматривает комментарии. Дело вот чем, я испробовал несколько скриптов такого рода, и у всех один недостаток, не описано как сделать исключения URL, потому что лезет всякий мусор, комментарии к статьям и прочее. Например, мне пригодилось бы исключить такую конструкцию http://site.ru/#
Итого имеем 4 отдельных скрипта, которые работают для генерации sitemap файла. Ну, а где информация о том, как все эти скрипты связать между собой? Или хотя бы, где ссылка чтобы скрипты скачать?
Помощь юзеру будет? есть сайт но как внедрить и запускать скрипт ..... или хотябы наводку где прочитать.
Спасибо заранее за ответ.
Добавить комментарий
Ваш e-mail: (не виден посетителям сайта)
Ваше имя:
Комментарий:
Символы с картинки:
Только выделенные поля формы добавления комментариев обязательны к заполнению.