[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Ошибка в коде или вообще - алгоритме
VolDroN
Хочу написать класс, который будет ходить по заданному url и искать различные ошибки (xss и.т.п.)
Проблемы возникли на сборе ссылок.
Код:
<?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 молчит и потом хром выдаёт:
Цитата
Веб-страница недоступна
Подключение к voldron прервано.
....
Ошибка 101 (net::ERR_CONNECTION_RESET): Соединение сброшено.




Спустя 1 час, 8 минут (16.10.2011 - 18:07) imbalance_hero написал(а):
set_time_limit(0), - это бесконечно. Тебе ещё user_abort надо. Вот связка:
    ignore_user_abort(true);
set_time_limit(0);


Если скрипт выполняется больше N-времени, то браузер сам обрывает соединение, указав ignore_user_about скрипт продолжит работу. Идея такова, что скрипт сбора инфы должен его набирать и записывать в файл/БД, а отдельным скриптом уже считывать полученные данные.

Спустя 42 минуты, 56 секунд (16.10.2011 - 18:50) VolDroN написал(а):
Всё равно те же ~10 секунд загружает, а потом обрывает соденинение.
О бд забыл, сейчас перепешу (:

Спустя 2 минуты, 19 секунд (16.10.2011 - 18:53) imbalance_hero написал(а):
VolDroN
Тебя обрывать будет в любом случае, скрипт будет выполняться на заднем плане сервером БЕЗ твоего участия. Тебе лишь в финале получить результат выполнения этой работы надо. То есть обратиться к данным, которые получит тот скрипт и внесёт в файл/БД

Спустя 1 час, 10 минут, 53 секунды (16.10.2011 - 20:03) VolDroN написал(а):
Нет, уже всё решил :)
Собирает хорошо, просто надо было поменять местами это:
	$this->collectionUrl($value);

// урл по которому мы уже прошлись не новый, что бы скрипт заного не ходил по нему переносим его в проверенные урлы
unset($this->urls['new'][$key]);
$this->urls['check'][] = $value;

потому что он просто удаление пропускал, и из-за этого получался бесконечный цикл.

Спустя 12 минут, 53 секунды (16.10.2011 - 20:16) imbalance_hero написал(а):
VolDroN
значит он обрабатывается быстрее 5 минут теперь. Мои скрипты 5-10-15 минут, браузер отрубался.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.