Новогодние праздники 666+666+666+6+6+6-го года в самом разгаре. За серьезные вещи совсем не хочется браться. Зато можно заняться всякими мелочами, до которых обычно не доходят руки. Такой мелочью для меня стала генерация файлов Sitemap.xml.
Sitemap.xml — это файл, содержащий в специальном формате ссылки на страницы сайта, которые должны быть проиндексированы поисковыми системами. Исчерпывающая информация о формате может быть найдена на Sitemaps.org.
Давно хотелось иметь удобный инструмент для формирования данных файлов.
Поиски в сети дали множество «удобных online-сервисов» для ручного создания карты сайта и несколько простеньких скриптов, которые также непригодны для создания карты сайта с большим количеством ссылок.
Что хотим?..
Чтобы сгенерировать sitemap.xml для небольшого сайта не нужно много усилий. Для больших же ресурсов есть особенности.
Существуют ограничения на размер файлов sitemap.xml в 10Мб, а также ограничения на в 50000 ссылок на один файл. Автоматическая обработка данных ограничений и стала моей целью.
Таким образом, были сформированы следующие требования:
- Скрипт должен следить за размером получаемых файлов и количеством добавленных url. При необходимости, создавать несколько файлов в соответствии с форматом;
- Не хранить промежуточные данные в памяти;
- Создавать по необходимости сжатые версии файлов, для отдачи с помощью nginx;
- Автоматически выполнять простейшие проверки данных.
Сказано — сделано. Конечный вариант скриптов можно найти по ссылке в конце статьи.
Чего не делает скрипт?
Чтобы предупредить дальнейшие вопросы скажу, что скрипт не является универсальным решением, которое в один чих сгенерирует карту для произвольного сайта.
Это лишь инструмент, и список ссылок, которые будут добавляться в файл, необходимо формировать самостоятельно, возможно, в несколько заходов.
Кроме того, скрипт не исправляет и не кодирует url, переданные ему. Поэтому позаботиться о соответствии ссылок стандарту RFC-3986 для URI, стандарту RFC-3987 для IRI и XML-стандарту.
Пример
С помощью данного инструмента карту сайта можно создавать примерно так:
<?php
require_once(dirname(__FILE__)."/../common.inc.php");
set_time_limit(0);
ini_set('memory_limit', '128M');
$dir = dirname(__FILE__);//document root path
$tmp_dir = dirname(__FILE__);//temp path
$base_url = 'http://mysite.ru/';//url with sitemaps (http://mysite.ru/sitemap.xml)
$gzip = true;
$config = array('path' => $dir , 'tmp_dir'=>$tmp_dir,'base_url'=>$base_url,'gzip'=>$gzip, 'gzip_level'=>9);
$builder = new SitemapBuilder($config);
$time = time();
$builder->start();
$builder->addUrl($base_url,$time,1.0);
$builder->addUrl($base_url."news",$time,1.0);
/*
//this is example adding url
$documents = News::find(array('criteria'=>'is_published=1'));
foreach($documents as $document)
$builder->addUrl($document->getUrl(),$document->getUtime(),0.8);
*/
$builder->commit();
Ссылки
Автор: vasiatka