Проблемы возникли на сборе ссылок.
Код:
<?php
class Debug
{
// урл по которому будут искать ссылки
private $url;
// массив содержащий ссылки. New - только что найденные ссылки (нужно во время работы скрипта),
// check - проверенные на наличие других ссылок ссылки.
private $urls = array('new' => array(), 'check' => array());
// проверяет правильный ли урл, если да то сохраняет его для дальнейшего использования
public function __construct($url)
{
$url = $this->_fullUrl($url);
if(!$this->_isUrl($url)) $this->_errorReporting('неправильный адрес');
$this->url = $url;
}
// создаёт объект
public static function create($url)
{
$obj = new Debug($url);
return $obj;
}
// собирает урлы с страниц
// $page_url - аргумент используемый при выполнении скрипта. В него скрипт передаёт внутренние найденные урлы,
// т.е. http://домен/contacts и.т.п.
public function collectionUrl($page_url = null)
{
$go = isset($page_url) ? $page_url : $this->url;
// получаем страницу
$content = file_get_contents($go);
if(empty($content)) $this->_errorReporting('пустая страница');
// вытаскиваем значения атрибутов href
preg_match_all("#href=(?:\"|'|)(.*)(?:\"|'|[>\s]).*>#isU", $content, $result);
// проходимся по значениям
foreach($result[1] as $key => $value)
{
// убираем лишнии ссылки
if($value == '#') continue;
if(mb_substr($value, 0, 10) == 'javascript') continue;
// делаем из атносительных полные пути
if($value == '/') $value = $this->url;
if(mb_substr($value, 0, 1) == '/') $value = $this->url.$value;
if(preg_match('#(^/)#', $value)) $value = $this->url.'/'.$value;
// разбиваем значение что бы получить домен
$slash = strpos($value, '/', 7);
$domen = substr($value, 0, $slash);
// сравниваем домен из найденной ссылки, с урл по которому мы ходим в данный момент.
// Урлы ведущии на другие сайты нам не нужны
if($domen == $this->url or $domen.'/' == $this->url)
{
// возможно что найденный урл уже встречался на других страницах, проверим
if(is_numeric(array_search($value, $this->urls['new'])) or is_numeric(array_search($value, $this->urls['check'])))
continue;
// в противном случае запишем его
else
if($this->_isUrl($value))
$this->urls['new'][] = $value;
}
else continue;
}
// проходимся по всем новым урлам в поисках ссылок
foreach($this->urls['new'] as $key => $value)
{
$this->collectionUrl($value);
// урл по которому мы уже прошлись не новый, что бы скрипт заного не ходил по нему переносим его в проверенные урлы
unset($this->urls['new'][$key]);
$this->urls['check'][] = $value;
}
Debug::dump($this->urls);
}
// проверяет правильный ли урл
private function _isUrl($url)
{
$connect = @get_headers($url);
return $connect ? true : false;
}
// допалняет урл до полного вида т.е. http://.../
private function _fullUrl($url)
{
if(empty($url)) $this->_errorReporint('пустой url');
$url = trim($url);
if(substr($url, 0, 7) != 'http://')
$url = 'http://'.$url;
$url = strrev($url);
if(strpos($url, '/') === 0) $url = substr($url, 1);
$url = strrev($url);
return $url;
}
// выводит ошибки
private function _errorReporting($string)
{
echo $string;
exit();
}
public static function dump($var)
{
echo '<pre>'; print_r($var); echo '</pre>';
}
}
?>
Вызываю:
set_time_limit(100500);
$debug = Debug::create('http://voldron')->collectionUrl();
Вообщем класс бегает сначала по самому введёному урлу (сдесь - http://voldron) а там уже по собравшимся ссылкам (т.е. http://voldron/faq и.т.п.) и ищет на них ещё ссылки.
При запуске - секунд 10 молчит и потом хром выдаёт: