25 Июня 2022 08:19 
Заработай шерингом
Навигация
 +  - 
Скачать игры
Сейчас на сайте
24.06.2022
escey
1 день
offline
23.06.2022
Warhangel
2 дней
offline
22.06.2022
Grave14
3 дней
offline
17.06.2022
gromokoks
1 неделя
offline
15.06.2022
sanek174
1 неделя
offline
Последние фото
Game of Blocks : WesterosCraft and Game of Thrones
Game of Blocks : Wes...
Альбом: Скриншоты

Вынос трёх пати куполом
Вынос трёх пати куполом
Альбом: Скриншоты



Альбом: Флора

Последние видео
Видео LIVE 24/7 Rolling Cam Venice : The most beautiful Live Cam in Venice Italy - Livecam en direct

Онлайн камеры:  LIVE 24/7 Rolling Cam Venice

Видео Rolling Cam World : Rolling Cam World - Live Webcam around the World

Онлайн камеры:  Rolling Cam World

Видео EarthCam Live: Times Square in 4K : Watch live streaming video in 4K of Times Square, New York City.

Онлайн камеры:  EarthCam Live: Times Square in 4K

Наша кнопочка
FAQ7.ru
Код:
RSS каналы
Новости
Комменты
Форум
Статьи
Фото
Файлы
Ссылки
Объявления
Реклама
Регистрация сайта в каталогах, раскрутка и оптимизация сайта, контекстная реклама
Автор темы: Warhangel
ID темы: 1961
Информация о теме:
Имеются 1 сообщений по данной теме, которая была просмотрена 10502 раз.
Реклама
Обменник Обменник
Просмотр темы
Логин:
Пароль:  
Форум » Тематические » Программирование » PHP
Просмотр темы
Текущий рейтинг: (Всего: 0 голосов)  
Ответить
Иконка 
Генератор карты сайта на PHP
Наверх Распечатать сообщение #1
Опубликовано 05-01-2017 22:07
Аватар пользователя

Супер Администратор



Сообщений: 2614
Вас поблагодарили: 22
раз(а) в 22 сообщениях

Зарегистрирован: 24.03.10
Со дня регистрации: 4476
Откуда: Россия

Скрыть награды


Пожаловаться на это сообщение 

Хочется сразу сообщить, что скрипт имеет недостатки - приоритеты и частота обновления проставляются одинаково, т.к. иной вариант подразумевает вычисление этих данных при помощи определённых записей из вашей базы данных. По той же причине в скрипте не проставляется дата последнего обновления страницы. Но не имея этих преимуществ - скрипт легко внедрится в любой сайт в качестве отдельного генератора или легко встроится, т.к. имеет весьма мало требований к настройке.

Как можно увидеть ниже - скрипт очень прост и использует базовые методы. В скрипте используется лишь одна самописная функция - "sitemap_geturls", работающая в цикле для каждой страницы сайта и вызываемая сама по себе для каждой последующей страницы сайта (кроме первого запуска). Цель функции - собирать работающие ссылки находящиеся на хосте сайта в переменную "urls" (переменная не копируется в функцию, копируется ссылка на неё, для экономии памяти) и проверить каждую ссылку на работоспособность и на содержание ещё не собранных ссылок. В комментариях к коду - смотрите подробности работы той или иной части скрипта.


PHP код генератора sitemap.xml

// Поможет при длительном выполнении скрипта
set_time_limit(0);
$host='makefuture.net'; // Хост сайта
$scheme='http://'; // http или https?
$urls=array(); // Здесь будут храниться собранные ссылки
$content=NULL; // Рабочая переменная
// Здесь ссылки, которые не должны попасть в sitemap.xml
$nofollow=array('/go.php','/search/',' /404/');
// Первой ссылкой будет главная страница сайта, ставим ей 0, т.к. она ещё не проверена
$urls[$scheme.$host]='0';
// Разрешённые расширения файлов, чтобы не вносить в карту сайта ссылки на медиа файлы. Также разрешены страницы без разрешения, у меня таких страниц подавляющее большинство.
$extensions[]='php';$extensions[]='aspx'; $extensions[]='htm';$extensions[]='html';$extensions[]= 'asp';$extensions[]='cgi';$extensions[]='pl';
// Корневая директория сайта, значение можно взять из $_SERVER['DOCUMENT_ROOT'].'/';
$engine_root='/usr/ local/www/makefuture.net/docs/';

// Функция для сбора ссылок
function sitemap_geturls($page,&$host,&$scheme,&$nofollow,&$exte nsions,&$urls)
{
   //Возможно уже проверяли эту страницу
   if($urls[$page]==1){continue;}
   //Получаем содержимое ссылки. если недоступна, то заканчиваем работу функции и удаляем эту страницу из списка
   $content=file_get_contents($page);if(!$content){unset($urls[$page ]);return false;}
   //Отмечаем ссылку как проверенную (мы на ней побывали)
   $urls[$page]=1;
   //Проверяем не стоит ли запрещающий индексировать ссылки на этой странице мета-тег с nofollow|noindex|none
   if(preg_match('/<[Mm][Ee][Tt][Aa].*[Nn][Aa][Mm][Ee]=.?(&qu ot;|\'|).*[Rr][Oo][Bb][Oo][Tt][Ss].*?("|\'|).*?[Cc ][Oo][Nn][Tt][Ee][Nn][Tt]=.*?("|\'|).*([Nn][Oo][Ff][Oo][Ll ][Ll][Oo][Ww]|[Nn][Oo][Ii][Nn][Dd][Ee][Xx]|[Nn][Oo][Nn][Ee]).*?("| \'|).*>/',$content)){$content=NULL;}
    //Собираем все ссылки со страницы во временный массив, с помощью регулярного выражения.
   preg_match_all("/<[Aa][\s]{1}[^>]*[Hh][Rr][Ee][Ff] [^=]*=[ '\"\s]*([^ \"'>\s#]+)[^>]*>/",$content,$tmp);$conte nt=NULL;
   //Добавляем в массив links все ссылки не имеющие аттрибут nofollow
   foreach($tmp[0] as $k => $v){if(!preg_match('/<.*[Rr][Ee][Ll]=.?("|\'|).*[Nn ][Oo][Ff][Oo][Ll][Ll][Oo][Ww].*?("|\'|).*/',$v)){$link s[$k]=$tmp[1][$k];}}
   unset($tmp);
    //Обрабатываем полученные ссылки, отбрасываем "плохие", а потом и с них собираем...
   for ($i = 0; $i < count($links); $i++)
   {
      //Если слишком много ссылок в массиве, то пора прекращать нашу деятельность (читай спецификацию)
      if(count($urls)>49900){return false;}
      //Если не установлена схема и хост ссылки, то подставляем наш хост
      if(!strstr($links[$i],$scheme.$host)){$links[$i]=$scheme.$host.$l inks[$i];}
      //Убираем якори у ссылок
      $links[$i]=preg_replace("/#.*/X", "",$links[$i]);
      //Узнаём информацию о ссылке
      $urlinfo=@parse_url($links[$i]);if(!isset($urlinfo['path' ])){$urlinfo['path']=NULL;}
      //Если хост совсем не наш, ссылка на главную, на почту или мы её уже обрабатывали - то заканчиваем работу с этой ссылкой
      if((isset($urlinfo['host']) AND $urlinfo['host']!=$host) OR $urlinfo['path']=='/' OR isset($urls[$links[$i]]) OR strstr($links[$i],'@')){continue;}
      //Если ссылка в нашем запрещающем списке, то также прекращаем с ней работать
      $nofoll=0;if($nofollow!=NULL){foreach($nofollow as $of){if(strstr($links[$i],$of)){$nofoll=1;break;}}}if($nofoll==1){conti nue;}
      //Если задано расширение ссылки и оно не разрешёно, то ссылка не проходит
      $ext=end(explode('.',$urlinfo['path']));
      $noext=0;if($ext!='' AND strstr($urlinfo['path'],'.') AND count($extensions)!=0){$noext=1;foreach($extensions as $of){if($ext==$of){$noext=0;continue;}}}if($noext==1){continue;}
  ;     //Заносим ссылку в массив и отмечаем непроверенной (с неё мы ещё не забирали другие ссылки)
      $urls[$links[$i]]=0;
      //Проверяем ссылки с этой страницы
      sitemap_geturls($links[$i],$host,$scheme,$nofollow,$extensions,$u rls);
   }
   return true;
}
 
// (START!) Первоначальный старт функции для проверки главной страницы и последующих
sitemap_geturls($scheme.$host,$host,$scheme,$nofollow,$ext ensions,$urls);

// Когда все ссылки собраны, то обрабатываем их и записываем в файлы sitemap.xml и sitemap.txt (должны быть права на запись)
$sitemapXML='<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.google.com/schemas/sitemap/0.84"
xmlns:xsi ="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocat ion="http://www.google.com/schemas/sitemap/0.84 http://www.google.com/schemas/sitemap/0.84/sitemap.xsd">
<! -- Last update of sitemap '.date("Y-m-d H:i:s+06:00").' -->';
$sitemapTXT=NULL;
 
// Добавляем каждую ссылку
foreach($urls as $k => $v){$sitemapXML.="\r\n<url><loc>{$k}</loc&g t;<changefreq>weekly</changefreq><priority>0.5</pr iority></url>";$sitemapTXT.="\r\n".$k;}
 
//Окончание для файла sitemap.xml
$sitemapXML.="\r\n</urlset>";

/ /Некоторые символы, а также кириллица - должны быть в правильной кодировке/виде (по спецификации)
$sitemapXML=trim(strtr($sitemapXML,array('%2F'=& gt;'/','%3A'=>':','%3F'=>'?&# 39;,'%3D'=>'=','%26'=>'&', 9;%27'=>"'",'%22'=>'"', 9;%3E'=>'>','%3C'=>'<','%23 '=>'#','&'=>'&')));
$sitemap TXT=trim(strtr($sitemapTXT,array('%2F'=>'/','%3A '=>':','%3F'=>'?','%3D'=>& #39;=','%26'=>'&','%27'=>"&# 39;",'%22'=>'"','%3E'=>'> ;','%3C'=>'<','%23'=>'#',& #39;&'=>'&')));

//Запись в файл
$fp=fopen($engine_root.'sitemap.txt','w+');if(!fw rite($fp,$sitemapTXT)){echo 'Ошибка записи!';}fclose($fp);
$fp=fopen($engine_root.'sitemap.xml' ;,'w+');if(!fwrite($fp,$sitemapXML)){echo 'Ошибка записи!';}fclose($fp);
 Offline
 
Посетить сайт автора
Цитировать
Ответить
Здесь присутствуют: 1 (пользователей: 0, гостей: 1)

« Предыдущая тема | Следующая тема »
 RSS Перейти на форум:
Розыгрыши 728х90

Последние объявления
ФотоЗаголовокГородРазмещено
АО «Карельский окатыш» и АО «Олкон» продают невостребованные ТМЦ
• Хозяйство - Оборудование Цена: 1 1
Другой21.06.2022
(на 1 месяц)
ООО «Техно Сталь» постоянно покупает КАНАТЫ СТАЛЬНЫЕ
• Хозяйство - Строительство и ремонт Цена: 1 1
Уфа27.05.2022
(на 1 месяц)
Филиал «КЧХК» АО «ОХК «УРАЛХИМ» в Кирово-Чепецке реализует неликвиды
• Хозяйство - Оборудование Цена: 1 1
Киров25.05.2022
(на 1 месяц)
Средство похудения с помощью проверенной программы LiDa
• Для дома - Здоровье Цена: 1 1
Москва24.11.2021
(на 24 месяца)
Аптека поможет убрать живот быстро и предлагает капсулы для снижения аппетита
• Для дома - Здоровье Цена: 1 1
Москва25.08.2021
(на 24 месяца)
Облако тегов тем форума
Исходный код/ Source Code, Нейронный процессор Zeroth, На BlizzCon пройдут сразу два киберспортивных турнира, Microsoft хотят сделать Xbox Play Anywhere межпоколенческим, Fable III на PC - Дневники разработчиков, Результаты тестирования Nvidia GeForce GTX 780 и GeForce GTX 770, Инструменты, Руководство по системе Гомункул, Семинар в Москве (Посвящения в магические каналы), Администрация Сучжоу проведет второе тестирование цифрового юаня, Почта Швейцарии выпустит первую в стране криптовалютную марку, Текстурный баг в библиотеке (Point Blank), Логические задачи, Вторая часть видео от Muffin о Cataclysm: Восточные королевства, Трейлер «Space Pirate Captain Harlock»
Главная Статьи Файлы Форум Ссылки Новости Фотогалерея Объявления Видео Файлобменник Гороскоп Торренты Радио Видеочат
Яндекс.Метрика
Powered by PHP-Fusion copyright © 2002 - 2022 by Nick Jones. Released as free software without warranties under GNU Affero GPL v3.