Напейсал быдлоскрипт, который логинится на одном сайте, а затем в цикле - качает страницу, парсит ссылку на ней при помощи preg_match, качает её. через некоторое время скрипт вылетает с такой ошибкой, что типа не может приконектится. Скрипт запускается на VDSе (причем пробовал уже на трех - везде такая фигня), целевой сайт тормозить не может - он довольно крупный (соц сеть средней крупности). Что делать? В чем может быть проблема? Как решить её?
Даже не знаю. Впринципе возможно такое. Но я вроде и реферрер шлю и куки и UserAgent нормальный. index.php PHP: <?php set_time_limit(0); ini_set('memory_limit', '256M'); error_reporting(E_ALL); ini_set('display_errors', 1); include('getpost.php'); $uza = 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0)'; $acc = 'login:parol'; $bot = explode(':', $acc); $login = $bot[0]; $parol = $bot[1]; ############## Авторизация ######################## $authdata = post('server.ru', "/script", "http://google.ru/", $uza, '', 'Login=' . $login . '&Password=' . $parol); // запрос на авторизацию $authcooki = getcookie($authdata); // получение куков while(1){ // бесконечный цикл $gett = get('server.ru', '/script_start_page', 'http://server.ru/', $uza, $authcooki, true); // получение самой первой страницы парсинга $startpage = !isset($targetpage) ? $gett : $targetpage; if(preg_match('|регулярное выражение для поиска ссылки|', $startpage, $link)){ $targetpage = get('server.ru', $link[1], 'http://server.ru/', $uza, $authcooki, true); // переход по нужной мне ссылке unset($link); } } ?> getpost.php PHP: <?php function getlocation($str){ preg_match("%Location: (\S+)%i", $str, $locat); $url = parse_url($locat[1]); return $url['path'] . '?' . $url['query']; } function get($host, $path, $ref, $ua, $cook, $dwnld = true) { $line=""; $fp=fsockopen($host, 80, $errno, $errstr, 10); if(!$fp){ die($errstr($errno)); }else{ $headers = "GET $path HTTP/1.1\r\n"; $headers .="Host: $host\r\n"; $headers .="User-Agent: $ua\r\n"; $headers .="Accept-Language: ru,ru-RU;q=0.9,en;q=0.8\r\n"; $headers .="Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"; $headers .="Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7\r\n"; $headers .="Referer: $ref\r\n"; $headers .="Cookie: $cook\r\n"; $headers .="Connection: Close\r\n\r\n"; fwrite($fp, $headers); if($dwnld == true){ while(!feof($fp)){ $line .= fgets($fp, 4096); } } } fclose($fp); return $line; } function post($host, $script, $ref, $ua, $cook, $cont){ $respons=""; $postsock = fsockopen($host, 80, $errno, $errstr, 10); if (!$postsock) echo $errstr($errno); else { $head = "POST $script HTTP/1.1\r\n"; $head .= "Host: $host\r\n"; $head .= "User-Agent: $ua\r\n"; $head .= "Accept-Language: ru,ru-RU;q=0.9,en;q=0.8\r\n"; $head .= "Connection: close\r\n"; $head .= "Referer: $ref\r\n"; $head .= "Cookie: $cook\r\n"; $head .= "Content-Type: application/x-www-form-urlencoded\r\n"; $head .= "Content-Length: " .strlen($cont). "\r\n"; $head .= "\r\n$cont\r\n"; fwrite($postsock, $head); while(!feof($postsock)){ $respons .= fgets($postsock, 4048); } fclose($postsock); } return $respons; } function getcookie($str){ $authcooki = ''; preg_match_all('/Set-Cookie:\s([^;]+)/i', $str, $temp); $temp[1] = array_unique($temp[1]); foreach($temp[1] as $cook){ $authcooki .= $cook . '; '; } return $authcooki; } ?>
Скрипт выполняется на хостинге? Попробуй простое подключение к гуглу, PHP: if(fsockopen('google.ru', 80)) { echo 'good'; } else { echo 'bad'; }
Да естественно, коннект есть, все работает - читай первый пост. Проблема в том, что скрипт после нескольких десятков итераций глохнет с warning-ом.
попугай Поставьте задержки при переходе на страницу. Скорее всего блочат по превышению количества запросов в минуту. Ну или просто - не останавливайте скрипт по ошибке (заглушив ошибку с помощью @ и убрав die(); ), а повторяйте текущий запрос после задержкт
ребята, у меня такая же ошибка возникла. причём это произошло после переноса обоих сайтов (и того на котором скрипт и того к которому скрипт подключается) на новый впс. в чём может быть проблема? PHP: if(fsockopen('google.ru', 80)) { echo 'good'; } else { echo 'bad'; } - возвращает good PHP: if(fsockopen('mysite.ru', 80)) { echo 'good'; } else { echo 'bad'; } - возвращает bad