Показать сообщение отдельно

  #7  
Старый 04.08.2008, 23:05
NOmeR1
Познавший АНТИЧАТ
Регистрация: 02.06.2006
Сообщений: 1,187
Провел на форуме:
6023777

Репутация: 2642


По умолчанию

Вобщем уже писал скрипт, который получает все ссылки с сайта, но он не всё получал, что надо.

Вот исправленная версия
Код:
<?php
	$site = 'http://localhost/';
	$mode = 2; // 1 = Использовать функцию file_get_contents, 2 = Использовать сокеты
	foreach(get_urls($site) as $url) {
		echo '<a href="'.$url.'">'.$url.'</a><br>'."\n";
	}
	@set_time_limit(0);
	@ini_set('max_execution_time', 0);
	function get($action) {
		$url = parse_url($action); 
		$fp = fsockopen($url['host'], 80, $errno, $errstr, 30); 
		if(!$fp) {
			return false;
		} else {
			fputs($fp, 'GET '.$action.' HTTP/1.0'."\r\n".
			'Host: '.$url['host']."\r\n".
			'Referer: '.$url['scheme'].'://'.$url['host'].$url['path']."\r\n\r\n");
			$result = '';
			while(!feof($fp)) {
				$result .= fgets($fp, 128);
			}
			fclose($fp);
			return $result;
		}
	}
	function my_sort($array) {
		$new_array = array();
		foreach($array as $value) {
			$new_array[] = $value;
		}
		return $new_array;
	}
	function JoinToSite($url, $site) {
		$domain = parse_url($site);
		$domain = $domain['scheme'].'://'.$domain['host'];
		if($url{0} == '/') {
			$link = $domain.$url;
		} else if(preg_match('~^http(s)?:~i', $url)) {
			if(parse_url($url, PHP_URL_HOST) == parse_url($site, PHP_URL_HOST)) {
				$link = $url;
			}
		} else {
			if(!preg_match('~^(ftp(s)?|javascript|mailto):~i', $url)) {
				$dirname = '';
				$explode = explode('/', parse_url($site, PHP_URL_PATH));
				foreach($explode as $i => $dir) {
					if($dir && $i != (count($explode)-1)) {
						$dirname .= $dir.'/';
					}
				}
				$link = $domain.'/'.$dirname.preg_replace('~(\A|/)\./~', '$1', $url);
				$regex = '~/(?!\.\./)[^\x2F]+/\.\./~';
				while(preg_match($regex, $link)) {
					$link = preg_replace($regex, '/', $link);
				}
			}
		}
		return (isset($link) ? $link : false);
	}
	function GetAllUrlsFromUrl($url, $all_links) {
		global $mode;
		$first = (($mode == 1) ? @file_get_contents($url) : get($url));
		preg_match_all('~<a[^>]+href[\x20]?=[\x20\x22\x27]?([^\x20\x22\x27\x3E]+)[\x20\x22\x27]?[^>]*>~i',  $first, $second);
		$array_urls = array();
		foreach($second[1] as $link) {
			$link = JoinToSite($link, $url);
			if($link !== false && !in_array($link, $all_links)) {
				$array_urls[] = $link;
			}
		}
		return ((count($array_urls) > 0) ? $array_urls : false);
	}
	function get_urls($url) {
		$old_links = array();
		$new_links = array($url);
		while(true) {
			$url = $new_links[0];
			$old_links[] = $url;
			array_shift($new_links);
			$get_urls = GetAllUrlsFromUrl($url, array_merge($old_links, $new_links));
			if($get_urls) {
				$new_links = array_merge($get_urls, $new_links);
			} else {
				if(sizeof($new_links)==0) {
					break;
				} else {
					continue;
				}
			}
		}
		sort($old_links);
		return $old_links;
	}
?>
Средний рез-тат сканирования 10 ссылок на localhost

Код:
С помощью file_get_contents	0.104 с.
С помощью сокетов		0.098 с.
Скрипт может работать медленно и долго. Используйте сокеты по мере возможности.

Ещё раз предупреждаю! Не надо использовать этот скрипт для больших CMS, форумов и т.п.! Вы нагружаете не только сервер, на котором находится скрипт, но и сайт, который сканируете!

Последний раз редактировалось NOmeR1; 05.08.2008 в 00:13..
 
Ответить с цитированием