Вчера открыла свой код и удивилась на сколько мне легко с ним работать. Вне я когда-то заложила логирование со счетчиком ошибок.
Представляю вашему вниманию для критики.
<?php
/**
* класс генерации sitemap
*
* 1 - должна выводить в лог размер файла sitemap
* 2 - должна выводить в лог количество урлов получившихся в sitemap
* 3 - должна проверять на длину урла и выводить змечание в лог
*
*/
class M_SITEMAP extends M_Core{
private $name = null; // название sitemap файла xml
private $path = null; // путь как правило в корень сайта
private $base_url = null; // базовый урл сайта
private $xml_file_name = null; // имя файла
private $xml_hdl = null; // heandler файлв xml sitemap
private $xml_url_len = 2048; // максимально допустимая длина урала
private $xml_url_cnt = 50000; // должно быть не более 50 000 URL
//Маскирование символов
private $xml_replace = array(
'&' => '&',
"'" => ''',
'"' => '"',
'>' => '>',
'<' => '<',
);
//Вероятная частота изменения этой страницы
//Допустимые значения:
private $xml_changefreq = array('always', 'hourly', 'daily', 'weekly', 'monthly', 'yearly', 'never');
private $time_start = null; //время начала выполнения скрпта
//public $time_end = null; //время окончаня выполнения скрипта
private $cnt_errors = 0; //количество критических ошибок
private $cnt_warings = 0; //количество ошибок
public $hand_destruct = false;
private $logHdl = null;
/**
* @param $name - без расширения xml
* @param $path - c "/" в конце
*/
public function construct($name,$path,$base_url)
{
$this->logWrite('-------------------------- START --------------------------');
$this->name = $name; $this->logWrite('name = '.$name);
$this->path = $path; $this->logWrite('path = '.$path);
$this->base_url = $base_url;
if(mb_substr($this->base_url,-1)=='/')
$this->base_url = mb_substr($this->base_url,0,-1);
$this->logWrite('base_url = '.$this->base_url);
$this->time_start = time();
}
public function __destruct()
{
if(!$this->hand_destruct)
$this->destruct();
$dtime = (time()-$this->time_start)/60; // время вполнения в минута
$this->logWrite('Executed time: '.$dtime.' min.');
}
public function destruct()
{
$filesize = filesize($this->path.$this->xml_file_name);
if(!$filesize)
$this->logWrite('ERROR: file size.','error');
$this->logWrite('Size of file <a href="/'.$this->xml_file_name.'" target="_blank">'.$this->xml_file_name.'</a>: '.$filesize.' byte (maximum 10 485 760 byte = 10Mb)');
$this->logWrite('WARINGS: '.$this->cnt_warings);
$this->logWrite('ERRORS: '.$this->cnt_errors);
$this->logWrite('');
$this->cnt_warings = 0;
$this->cnt_errors = 0;
$this->logWrite('-------------------------- END --------------------------');
}
public function logOpen($filename,$clear=true)
{
$this->logWrite('logOpen: '.$filename);
$this->logHdl = fopen($this->path.$filename,$clear?'w':'a');
$this->logWrite('-------------------------- START in log --------------------------');
}
protected function logClose()
{
if(!$this->logHdl)
return;
$this->logWrite('-------------------------- END in log --------------------------');
fclose($this->logHdl);
}
public function logWrite($str,$counter='ok')
{
$text = "\r\n".'<br />'.date('d.m.Y H:i:s').' >> '.$str;
if($this->logHdl)
fwrite($this->logHdl,$text);
else
echo $text;
ob_get_contents(); ob_flush();flush();
switch ($counter)
{
case 'error':
$this->cnt_errors +=1;
break;
case 'waring':
$this->cnt_warings +=1;
break;
}
}
private function xmlOpen()
{
if(!is_dir($this->path))
mkdir($this->path,0755,true);
$this->xml_file_name = $this->name.'.xml';
$this->xml_hdl = fopen($this->path.$this->xml_file_name,"w");
if($this->xml_hdl)
$this->logWrite('xmlOpen '.$this->xml_file_name.' successfully ');
else
$this->logWrite('WARING: xmlOpen '.$this->xml_file_name.' E_WARNING '.E_WARNING, 'waring');
}
private function xmlClose()
{
$this->logWrite('xmlClose '.$this->xml_file_name);
fclose($this->xml_hdl);
}
private function xmlWrite($str)
{
fwrite($this->xml_hdl, $str);
}
private function xmlHeader()
{
return '<?xml version="1.0" encoding="UTF-8"?>'.
"\n\r".'<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">';
}
private function xmlFooter()
{
return "\n\r".'</urlset>';
}
/**
* получить дату в формате типа 2004-10-01T18:23:17+00:00
* @param $date - дата в формате 2004-10-01 18:23:17.121212121
* @return void
*/
private function xmlDateForm($date)
{
if(strpos($date, '.') !== false)
list($date,$x) = explode('.',$date);
list($d,$t) = explode(' ',trim($date));
return $d.'T'.$t.'+00:00';
}
/**
* Маскирование символов в урле
* Преобразовывает урл в допестимый вид
* Проверяет на максимально допустимую длину
* @param $url
* @return mixed
*/
private function xmlUrlForm($url)
{
if(mb_substr($url,0,1)=='/')
$url = $this->base_url.str_replace(array_keys($this->xml_replace), array_values($this->xml_replace),$url);
else
$url = str_replace(array_keys($this->xml_replace), array_values($this->xml_replace),$url);
if(strlen($url)>$this->xml_url_len)
$this->logWrite('WARRING url '.$url.': Lenth = '.strlen($url).' (maximum '.$this->xml_url_len.')', 'waring');
return $url;
}
/**
* @param $url - полный путь к странице $doc['full_alias']
* @param $date - дата последнего обновления $doc['update_date'] - прям как с базы взято
* @param null $changefreq - Вероятная частота изменения этой страницы
* @param null $priority
* @return void
*/
private function xmlURL($url,$date=null,$changefreq=null,$priority=null)
{
$url = $this->xmlUrlForm($url);
$this->logWrite("\t".'get URL: '.$url);
$url_tag = "\n\r\t";
$url_tag .= '<url>';
$url_tag .= "\n\r\t\t".'<loc>'.$url.'</loc>';
if($date)
$url_tag .= "\n\r\t\t".'<lastmod>'.$this->xmlDateForm($date).'</lastmod>';
if(in_array($changefreq,$this->xml_changefreq))
$url_tag .= "\n\r\t\t".'<changefreq>'.$changefreq.'</changefreq>';
if($priority)
$url_tag .= "\n\r\t\t".'<priority>'.$priority.'</priority>';
$url_tag .= "\n\r\t".'</url>';
return $url_tag;
}
public function xmlComplate($docs)
{
$this->xmlOpen();
$docs_count = count($docs);
$this->logWrite('xmlComplate. Finded '.$docs_count.' doccuments. Remember! maximumum '.$this->xml_url_cnt.'.');
if($docs_count>$this->xml_url_cnt)
$this->logWrite('WORRING! count doccuments more then '.$this->xml_url_cnt.'.', 'waring');
$this->xmlWrite($this->xmlHeader());
if(!empty($docs))
{
foreach($docs as $doc)
{
$full_alias = getElement($doc,'full_alias');
if(!$full_alias)
{
$this->logWrite("\t".'ERROR URL: '.var_export($doc,1),'error');
continue;
}
$this->xmlWrite(
$this->xmlURL(
$full_alias,
getElement($doc,'update_date'),
getElement($doc,'xml_changefreq'),
getElement($doc,'xml_priority')
)
);
}
}
$this->xmlWrite($this->xmlFooter());
$this->xmlClose();
// обновить дату карты
$this->dbUpdate();
$this->logWrite('Update sitemap date of lastmod.');
}
//-- ----------------------------------------------------------------------------------------------------- ----- --//
private function dbUpdate()
{
$query = "SELECT name FROM t_sitemap WHERE name='".$this->xml_file_name."'";
if($this->DB->execute($query))
{
$query = "UPDATE t_sitemap SET update_date=now() WHERE name='".$this->xml_file_name."'";
}
else
{
$query = "INSERT into t_sitemap (name) VALUES ('".$this->xml_file_name."')";
}
$res = $this->DB->query($query);
if(!$res)
throw new Exception('dbUpdate');
else
return true;
}
private function dbGetInfo()
{
$query = "SELECT * FROM t_sitemap ORDER BY name";
return $this->DB->execute($query);
}
//-- ----------------------------------------------------------------------------------------------------- ----- --//
public function xmlIndexComplate()
{
$this->xmlOpen();
$this->logWrite('xmlIndexComplate.');
$this->xmlWrite('<?xml version="1.0" encoding="UTF-8"?>'.
"\n\r".'<sitemapindex xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">');
$maps = $this->dbGetInfo();
if(!empty($maps))
{
foreach($maps as $map)
{
if(!file_exists($this->path.$map['name']))
{
$this->logWrite('WARING: no such file '.$map['name'],'waring');
continue;
}
$this->xmlWrite("\n\r\t".'<sitemap>'.
"\n\r\t\t".'<loc>'.$this->xmlUrlForm('/'.$map['name']).'</loc>'.
"\n\r\t\t".'<lastmod>'.$this->xmlDateForm($map['update_date']).'</lastmod>'.
"\n\r\t".'</sitemap>');
}
}
$this->xmlWrite('</sitemapindex>');
$this->xmlClose();
}
}
?>
А вот использование
#!/usr/bin/php
<?php
/**
* Новости
* @created 07.01.12
* @author olgatcpip <olgatcpip@ya.ru> http://webolga.ru
*/
require_once("/var/www/html/defines.php");
//require_once("../../defines.php");
require_once(BASE_DIR."config.php");
require_once(BASE_DIR."functions.php");
$name = 'news-sitemap';
$CORE = $SITEMAP = new M_SITEMAP();
$SITEMAP->hand_destruct = true;
$SITEMAP->logOpen(BASE_DIR.$name.'.log');
try{
$DOCUMENTS = new M_Documents();
foreach($SITEMAP->CITY->getAll() as $c)
{
//собираем лоты пока новосиба
$parentID = $SITEMAP->CONFIG['pages']['news'];
//$docs = dsEnumDocumentsWthParent($parentID,true);
$docs = $DOCUMENTS->EnumDocumentsWthParent($parentID, $c['id_city'],true);
foreach($docs as $i=>$doc)
{
if($doc['template_id'] == $SITEMAP->CONFIG['templates']['list'])
{
$docs[$i]['xml_changefreq'] = 'daily';
$docs[$i]['xml_priority'] = '0.8';
}
}
//--- ------------------
$domen = $c['domen'];
$SITEMAP->construct($name, SITEMAP_DIR.$domen.'/', 'http://www.'.$domen.'.'.BASE_DOMEN);
$SITEMAP->xmlComplate($docs);
$SITEMAP->destruct();
}
}
catch(Exception $err){
$SITEMAP->logWrite($err,'error');
}
?>
Спустя 13 дней, 5 часов, 24 минуты, 12 секунд (20.01.2012 - 12:15) UnWind написал(а):
По мойму классный код ! Не против если возьму на вооружение некоторые элементы кода ?
Спустя 8 минут, 42 секунды (20.01.2012 - 12:24) Семён написал(а):
foreach($SITEMAP->CITY->getAll() as $c)

Спустя 1 час, 16 минут, 29 секунд (20.01.2012 - 13:40) alex12060 написал(а):
не плохой стиль, но намудрено, ух.
Спустя 6 минут, 29 секунд (20.01.2012 - 13:47) Winston написал(а):
Семён
Что не так?
Что не так?

Спустя 1 час, 3 минуты, 45 секунд (20.01.2012 - 14:51) inpost написал(а):
А какой смысл в $xml_replace ? Там одно на одно заменяется, никакой разницы.
_____________
Ласковое слово и кошке приятно... Плюсик в карму сойдет wink.gif
*smarty дока - новая любовь
Моё рукотворение ругайте, хвалите smile.gif
Веду маленький блог
в этом блоге публикую новые работы
WMR217126627282 wink.gif