Дек 152012
 

В этой статье пойдет речь о том, как сделать самообновляющийся файл sitemap.xml (что это).

Более того, речь пойдет о файле сайтмэп для сайтов с огромным количеством страниц (10 000, 100 000). Страницы должны генерироваться из базы данных, вы должны хорошо понимать алгоритм образования страниц на вашем сайте, т.к. в примере приведены фиктивные данные для вывода определенных страниц.

Так как же сделать sitemap для таких сайтов так, чтобы сервер не упал от нагрузки?

Нам потребуется создать 3 файла.

1. Файл sitemap.php
В нем мы высчитываем количество записей, и генерируем ссылки на страницы для других сайтмепов, по 1000 на страницу, чтобы не было нагрузки на сервер. Ессно, нужно прописать свои названия таблиц, свое доменное имя и бд..

<?
header("content-type: text/xml;");

echo '<?xml version="1.0" encoding="UTF-8"?>
<sitemapindex 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/siteindex.xsd">
';

include 'config.php';
		DEFINE('ITEMS_PER_PAGE', 1000);

$query="SELECT COUNT(*) FROM queries";
$res = mysql_query( $query );
$total = mysql_result( $res, 0, 0 );

$howmuch=ceil($total/ITEMS_PER_PAGE);
for($i=1; $i<=$howmuch; $i++)
{
echo '<sitemap><loc>http://mysomesite.ru/sitemap'.$i.'.xml</loc></sitemap>';
}
?>
</sitemapindex>

Обратите внимание: файл config.php содержит в себе подключение к базе данных, его примерное содержимое

 <?
$host 		= "localhost";
$dbuser 	= "user";
$dbpass 	= "pass";
$db 		= "db";
$link = mysql_connect($host, $dbuser, $dbpass) or die("cannot connect"); 
mysql_select_db($db, $link); 
?>

2. Далее файл sitemap2.php

<?
header("content-type: text/xml;");
include 'config.php';
	// let us generate sitemap!
$data_r.='<?xml version="1.0" encoding="UTF-8" ?> 
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
';
############1 data from pages table
		DEFINE('ITEMS_PER_PAGE', 1000);
$query="SELECT COUNT(*) FROM queries";
$res = mysql_query( $query );
$total = mysql_result( $res, 0, 0 );

if ( isset($_GET['page']) ) {
		  $page = (int)$_GET['page'];
		  if ( $page < 1 ) $page = 1;
		} else {
		  $page = 1;
		}
if ($page==1)
{

  $data_r.='<url><loc>http://mysomesite.ru</loc> 
  <changefreq>always</changefreq> 
  <priority>0.5</priority> 
</url>

';	
}
		// Сколько всего получится страниц
		$cnt_pages = ceil( $total / ITEMS_PER_PAGE );
		if ( $page > $cnt_pages ) $page = $cnt_pages;
		// Начальная позиция
		$start = ( $page - 1 ) * ITEMS_PER_PAGE;

$sm_data=mysql_query("SELECT * FROM  
queries LIMIT ".$start.", ".ITEMS_PER_PAGE);

 while($sm_row=mysql_fetch_array($sm_data))
 {
 $sm_row['query2']=str_replace(" ","+", $sm_row['query']);
	$data_r.= '
<url>
  <loc>http://mysomesite.ru/res.php?q='.$sm_row['query2'].'</loc> 
  <changefreq>never</changefreq> 
  <priority>0.1</priority> 
</url>
';
 }
$data_r.='</urlset>';
$content = $data_r;

echo $content;
?>

3. Если у вас нет файла .htaccess — создайте его, если есть — просто допишите следующее

RewriteEngine On
RewriteRule ^sitemap.xml$ sitemap.php [L]
RewriteRule ^sitemap([^/]*).xml$ sitemap2.php?page=$1 [L]

Если у вас уже есть этот файл, проверьте, была ли в нем строка RewriteEngine On. Если была — не добавляйте ее повторно.

Теперь можно перейти по адресу http://ваш_сайт.ru/sitemap.xml — если все верно сделали, увидите список ссылок на другие файлы сайтмэпа, потипу http://ваш_сайт.ru/sitemap1.xml при переходе на которые и будет выводиться список страниц.

Дорогие читатели! Мною было принято решение закрыть комментарии на блоге. Теперь все обсуждения переносятся на недавно открытый форум, ввиду того, что формат сообщений там намного удобней для обсуждения. Не стесняйтесь задавать любые вопросы по тематике блога! Я всегда на связи.
Перейти на форум
.
 Опубликовано в 10:15 пп

Извините, форма комментирования закрыта в данный момент.