Редкие странные чтения с fsockopen - PullRequest
2 голосов
/ 14 июля 2010

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

<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

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

<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 <b>".$url["host"]."</b>");
  } 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 ]

2 голосов
/ 14 июля 2010

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

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


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

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

0 голосов
/ 14 июля 2010

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

...