Задачки на PHP

5.78K
.
(\/)____o_O____(\/)
reaper, вроде получилось нарисовать парсер, правда валится пока с ошибкой примерно на 3 гиг памяти, при всем при этом около 10% ссылок только проходит, на тест сайте около 200к ссылок, апач выходит за лимиты, тестил на локале, буду доделывать чтоб по этапно в несколько раз проходил
.
Koenig, Ну что я могу сказать? Пробуй.
.
(\/)____o_O____(\/)
даю скрипт для обозрения, пока он у меня работает как тест компа после разгона и тест стабильности, проц и память жрет на сто
настройки пхп
лимит времени выполнения выключен, память пхп 4048 М
set_time_limit(0);
$db_host = 'localhost';
$db_name = 'dumper';
$db_user = 'root';
$db_pass = '';

$connect = @mysql_connect($db_host, $db_user, $db_pass) or die('Error: cannot connect to database server');
@mysql_select_db($db_name) or die('Error: specified database does not exist');
@mysql_query("SET NAMES 'utf8'", $connect);

mb_internal_encoding('UTF-8');

/*
CREATE TABLE IF NOT EXISTS `parser` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `ready` int(1) NOT NULL DEFAULT '0',
  `url` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `url` (`url`),
  KEY `ready` (`ready`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
*/

class Kurlparser {

private $homeurl;

public function __construct($homeurl) {
$homeurl = trim((substr($homeurl, -1) != '/' ? $homeurl : substr($homeurl, 0, -1)));
$this->setHomeurl($homeurl);
$this->parser($homeurl);
}

public function run() {
$cnt = mysql_result(mysql_query("select count(*) from `parser` where `ready` = 0"), 0);
if ($cnt > 0) {
$res = mysql_query("select `url` from `parser` where `ready` = 0");
while ($row = mysql_fetch_row($res)) {
$this->parser($row[0]);
}
} else {
// end recursive
echo '<div>THE END</div>'; exit;
}
}

public function parser($url) {
if ($url != $this->homeurl) {
$this->updateBase($url);
} else {
mysql_query("insert into `parser` (`ready`, `url`) values(1, '" . $url . "')");
}

$html = $this->getHtml($url);

$doc = new DOMDocument();
@$doc->loadHTML($html);
$links = $doc->getElementsByTagName('a');

foreach ($links as $element) {
$link = $element->getAttribute('href');

if(substr($link, 0, 7) != 'http://') {
$link = $this->homeurl . '/' . $link;
}

if (strpos($link, $this->homeurl) !== false) {
if ($link != $url && substr($link, -1) != '/' && substr($link, -1) != '?' && substr($link, -1) != '#') { // && $this->validUrl($link)

if (mysql_result(mysql_query("select count(*) from `parser` where `url` = '" . $link . "'"), 0) == 0) {
$this->addBase($link);
}

}
}

}
$this->run();
}

public function setHomeurl($url) {
$this->homeurl = $url;
}

public function getHomeurl() {
return $this->homeurl;
}

public function addBase($url) {
if (mysql_query("insert into `parser` (`url`) values('" . $url . "')")) {
#echo '<div>insert ' . $url . '</div>';
} else {
#echo '<div>not insert ' . $url . '</div>';
}
}

public function updateBase($url) {
if (mysql_query("update `parser` set `ready` = 1 where `url` = '" . $url . "'")) {
#echo '<div>update ' . $url . '</div>';
} else {
#echo '<div>not update ' . $url . '</div>';
}
}

public function validUrl($url) {
$headers = get_headers($url);
return preg_match('|200|', $headers[0]) ? true : false;
}

public function getHtml($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT, 'Koenig sitemap generator BETA 0.1');
curl_setopt($curl, CURLOPT_COOKIEFILE, dirname(__FILE__) . '/cookie.txt');
curl_setopt($curl, CURLOPT_COOKIEJAR, dirname(__FILE__) . '/cookie.txt');
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, 1);
$data = curl_exec($curl);
curl_close($curl);
return $data;
}

}

$a = new Kurlparser('http://sait.ru');


пока доку не писал и прочие мелочи, отступы я тоже потом через http://phpbeautifier.com/ ставлю
подскажите может где память так жрет, или просто у меня сайт такой, где дублирующих ссылок много, и вообще много ссылок
смысл собрать все ссылки с сайта и создать карту xml для роботов
.
(\/)____o_O____(\/)
нагрузки при работе скрипта http://johncms.com/users/album ... &view
при fcgi память медленнее утекает, после ошибки по окончанию памяти можно обновить страницу и скрипт продолжит работу
.
(\/)____o_O____(\/)
не тестить на живом хосте, только на локальном сервере, так как соазу наверное по нагрузкам не пропустят, да и памяти с временем не хватит
.
Жрет у тебя оно столько из-за количества запросов к БД.
.
(\/)____o_O____(\/)
L!MP, по процессам мускул 5 метров есть, пых в 6 потоков по 600 метров, бывает один из процессов до гиги доходит
.
Koenig, какой ты сайт парсиш?
.
(\/)____o_O____(\/)
вот думаю может на файлы переписать, но вот как реализовать, так как если массивы с файлов делать, тоже не мало памяти уйдет, а как по другому сравнивать я даже и не придумаю
.
(\/)____o_O____(\/)
L!MP, http://nwinf.ru/
Всего: 173