20 Апреля 2024 02:28 
Заработай шерингом
Навигация
 +  - 
Скачать игры
Сейчас на сайте
19.04.2024
Apollo
02:32:19
offline
19.04.2024
Samurai97
03:28:14
offline
19.04.2024
Aloha123
11:17:45
offline
15.04.2024
fukkinside
4 дней
offline
14.04.2024
V1ad
5 дней
offline
Последние фото
Game of Blocks : WesterosCraft and Game of Thrones
Game of Blocks : Wes...
Альбом: Скриншоты

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



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

Последние видео
Видео THE WORLD LIVE -  since 2008 | earthTV : So thank you for the many views of this stream, please enjoy the original classic television version of THE WORLD LIVE, first uploaded here for you in 2008 with just 7 locations.

Онлайн камеры:  THE WORLD LIVE - since 2008 | earthTV

Видео The Best Of Norway's Railway Cab Views : I\

Онлайн камеры:  The Best Of Norway's Railway Cab Views

Видео 130 LIVE World Cameras : 130 LIVE World Cameras, Relaxing Music, Map, Daily Timelapse - Your Armchair Travel

Онлайн камеры:  130 LIVE World Cameras

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

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



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

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

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


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

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

Как можно увидеть ниже - скрипт очень прост и использует базовые методы. В скрипте используется лишь одна самописная функция - "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
Другой18.04.2024
(на 1 месяц)
АО «Обуховский завод» реализует неликвиды
• Хозяйство - Сырье и материалы Цена: 1 1
Санкт-Петербург29.03.2024
(на 1 месяц)
Облако тегов тем форума
Как повысить скилл в игре кс1.6?, Китай обновил рейтинг криптовалютных проектов, Изменение политики паролей в Active Directory, Чит для Dota 2, Описание обновления 2.4.0 для PTR, MMO по Mass Effect может принести больше денег, чем SWTOR, BCH и BSV выросли перед уполовиниванием. Ждет ли то же самое биткоин?, Ява сервер Lineage 2 Interlude от команды Quattro Team, Кибервойска России вошли в топ-5 лучших армий мира, ROBOCOP - Official Trailer (2014), Гайд фрост Маг (лёд) 5.1.0 Mists of Pandaria, Стоматология, Компиляция L2jFree, BitPay прошел аудит на соответствие требованиям SOC-2, Dragona - начало ЗБТ намечено на 13 мая
Главная Статьи Файлы Форум Ссылки Новости Фотогалерея Объявления Видео Файлобменник Гороскоп Торренты Радио Видеочат
Powered by PHP-Fusion copyright © 2002 - 2024 by Nick Jones. Released as free software without warranties under GNU Affero GPL v3.