Вообщем хочу написать парсер используя функцию fsockopen(). Пишу такой код. PHP: <?php $proxyhost = "78.153.210.191"; $proxyport = 80; $http_request = "GET /moi-rasshirenija-joomla.html HTTP/1.1" . "\r\n"; $http_request .= "Host: www.ageent.ru" . "\r\n"; $http_request .= "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3"; $http_request .= "Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8" . "\r\n"; $http_request .= "Accept-Language: ru,en-us;q=0.7,en;q=0.3" . "\r\n"; $http_request .= "Accept-Encoding: gzip,deflate" . "\r\n"; $http_request .= "Accept-Charset: windows-1251,utf-8;q=0.7,*;q=0.7" . "\r\n"; $http_request .= "Keep-Alive: 300" . "\r\n"; $http_request .= "Connection: keep-alive" . "\r\n"; $http_request .= "Cache-Control: max-age=0". "\r\n\r\n"; $fp = fsockopen($proxyhost, $proxyport); if ($fp) { // передаем запрос fwrite($fp,$http_request); // читаем ответ while (!feof($fp)) { $http_response = fgets($fp, 1024); if (preg_match("/^HTTP\/1\.\d (\d+) (.*)/", $http_response, $found)) { $response_code = $found[1]; $response_text = $found[2]; break; } } print_r($http_response); } else { echo "2"; } if ($response_code = 200) { echo "1"; } ?> В ответ мне приходит что соединении удалось и все!. Вопрос, а как тело документа получить-то?
"break;" - удали, получение ниформации прерывается сразу после распознавания ответа и не "print_r($http_response);" а "echo $http_response;", это не массив будет, а переменная, содержащая результат (фактически просто текст)
тс, готовая функция - http://mrthe.name/2009/03/sockets-php/ и если ты хочешь получать содержимое без заголовков, то нужно делать либо 2 цикла, либо потом обрабатывать регуляркой. пример с 2-мя циклами по ссылке выше.
mr.The PHP: ffunction get_page($site,$page,$isheaders=false,$ua='Opera 9.27 (compatible; MSIE 6.0; Windows NT 5.1; ru)',$ref='',$cookie='',$post='') { $page=trim($page); $site=trim($site); Первые 4 строчки, 4 замечания: 1. Слово ffunction сам видиш две - ff 2. Необязательная переменная $ua задана уже в середине функции, но после неё идут обязательные переменные, что делает и эту переменную при вызове функции обязательной. Если не понятно, то, как вызвать функцию, не передавая ей юзерагент, т.к. он уже по умолчанию задан Оперой ? Такие установленые параметры должны быть последние в функции. 3. $page=trim($page); зачем ??? 4. $site=trim($site); зачем ??? Я считаю водобную процедуру нужно делать от ситуации, если вдруг передаеш с файла массива и там есть разрывы. И делать это до функции а не применять всегда.
Также весьма немаловажно, сугубо на мой взгляд, имхо, предусмотреть вариации - GET или POST запрос. В моих брутерах в 50-70% процентов случаев прокатывает именно POST. Но почему-то этого практически никто не предусматривает в своих классах и функциях.
на всякий. часто было когда загонял случайно туда сайт вида site.ru\r\n и запрос оказывался некорректным. действительно.. обычно это не так сложно, да у меня если юзались последующие переменные, то и браузер тоже менялся кадый раз.. опечатка.