2010-07-14 3 views
2

Я использую fsockopen на небольшой cronjob для чтения и анализа каналов на разных серверах. Для самого прошлого это работает очень хорошо. Тем не менее, на некоторых серверах, я получаю очень странные линии в ответ, например:Редкие странные чтения с fsockopen

<language>en</language> 
<sy:updatePeriod>hourly</sy:updatePeriod> 
<sy:updateFrequency>1</sy:updateFrequency> 

11 
<item> 
    <title> 
1f 
July 8th, 2010</title> 
    <link> 
32 
http://darkencomic.com/?p=2406</link> 
    <comments> 
3e 

Но когда я открываю канал в, например, блокнот ++, он отлично работает, показывая:

<language>en</language> 
<sy:updatePeriod>hourly</sy:updatePeriod> 
<sy:updateFrequency>1</sy:updateFrequency> 
    <item> 
    <title>July 8th, 2010</title> 
    <link>http://darkencomic.com/?p=2406</link> 
    <comments> 

... только чтобы показать отрывок. Итак, я делаю что-то неправильно здесь, или это не поддается контролю? Я благодарен за любую идею исправить это. Вот часть кода, я использую для получения кормов:

 
$fp = @fsockopen($url["host"], 80, $errno, $errstr, 5); 
    if (!$fp) { 
    throw new UrlException("($errno) $errstr ~~~ on opening ".$url["host"].""); 
    } else { 
    $out = "GET ".$path." HTTP/1.1\r\n" 
    ."Host: ".$url["host"]."\r\n" 
    ."Connection: Close\r\n\r\n"; 
    fwrite($fp, $out); 
    $contents = ''; 
    while (!feof($fp)) { 
    $contents .= stream_get_contents($fp,128); 
    } 
    fclose($fp); 

ответ

2

Это выглядит как HTTP Chunked transfer encoding - это способ, которым HTTP имеет сегментирование ответа на несколько мелких частей; процитировать:

Каждый непустой куска начинается с числа октетов данных, которые он встраивает (размер написан в шестнадцатеричном формате) с последующим с помощью CRLF (возврат каретки и линии подачи), а сами данные ,
Затем кусок закрыт CRLF.
В некоторых реализациях, пробелы символов (0x20) заполняются между размером куска и CRLF.


При работе с fsockopen и тому подобное, вам придется иметь дело с протоколом HTTP сами ... это не всегда так просто, как можно было бы подумать ;-)

решение избежать для работы с таким материалом было бы использовать что-то вроде curl: оно уже знает протокол HTTP - это означает, что вам не нужно будет повторно изобретать whe;;)

+0

Хех, но мне нравится изобретать колесо! ;) Спасибо за информацию, которая многое помогла! – Ineluki

+0

Ну, заново изобретать колесо может быть интересно - если у вас много времени ;-) ;; пожалуйста :-) –

0

Я не вижу ничего странного в том, что может привести к такого рода поведению. Есть ли способ использовать cURL для этого? Это может решить проблему в целом :)

Смежные вопросы