Правильные заголовки для fsockopen

Discussion in 'PHP' started by ageent, 3 Oct 2009.

  1. ageent

    ageent New Member

    Joined:
    9 Jan 2009
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Вообщем хочу написать парсер используя функцию 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($fp1024);
            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";
    }
    ?>
    В ответ мне приходит что соединении удалось и все!. Вопрос, а как тело документа получить-то?
     
    #1 ageent, 3 Oct 2009
    Last edited: 3 Oct 2009
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    "break;" - удали, получение ниформации прерывается сразу после распознавания ответа

    и не "print_r($http_response);" а "echo $http_response;", это не массив будет, а переменная, содержащая результат (фактически просто текст)
     
  3. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    тс, готовая функция - http://mrthe.name/2009/03/sockets-php/

    и если ты хочешь получать содержимое без заголовков, то нужно делать либо 2 цикла, либо потом обрабатывать регуляркой. пример с 2-мя циклами по ссылке выше.
     
  4. b3

    b3 Moderator

    Joined:
    5 Dec 2004
    Messages:
    2,041
    Likes Received:
    933
    Reputations:
    199
    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); зачем ???
    Я считаю водобную процедуру нужно делать от ситуации, если вдруг передаеш с файла массива и там есть разрывы. И делать это до функции а не применять всегда.
     
    _________________________
  5. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Также весьма немаловажно, сугубо на мой взгляд, имхо, предусмотреть вариации - GET или POST запрос. В моих брутерах в 50-70% процентов случаев прокатывает именно POST. Но почему-то этого практически никто не предусматривает в своих классах и функциях.
     
  6. mr.The

    mr.The Elder - Старейшина

    Joined:
    30 Apr 2007
    Messages:
    1,080
    Likes Received:
    456
    Reputations:
    38
    на всякий. часто было когда загонял случайно туда сайт вида site.ru\r\n и запрос оказывался некорректным.
    действительно.. обычно это не так сложно, да у меня если юзались последующие переменные, то и браузер тоже менялся кадый раз..
    опечатка.