2 Stimmen

Seltene seltsame Messwerte mit fsockopen

Ich verwende fsockopen in einem kleinen Cronjob, um Feeds auf verschiedenen Servern zu lesen und zu parsen. In den meisten Fällen funktioniert das sehr gut. Doch auf einigen Servern erhalte ich sehr seltsame Zeilen in der Antwort, wie diese:

<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

Wenn ich den Feed jedoch z. B. in Notepad++ öffne, funktioniert er einwandfrei und wird angezeigt:

<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>

...nur um einen Auszug zu zeigen. Mache ich hier etwas falsch oder liegt das außerhalb meiner Kontrolle? Ich bin für jede Idee dankbar, wie ich das Problem beheben kann. Hier ist ein Teil des Codes, den ich zum Abrufen der Feeds verwende:

$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);

2voto

Pascal MARTIN Punkte 384469

Dies sieht aus wie HTTP Chunked Übertragung Kodierung -- ein Verfahren, mit dem HTTP eine Antwort in mehrere kleine Teile aufteilt; Zitat :

Jeder nicht leere Chunk beginnt mit dem Anzahl der Oktette der Daten, die er einbettet (Größe in hexadezimaler Schreibweise), gefolgt von gefolgt von einem CRLF (Wagenrücklauf und Zeilen feed) und den eigentlichen Daten.
Der Brocken wird dann mit einem CRLF abgeschlossen.
In einigen Implementierungen, Leerzeichen Zeichen (0x20) zwischen chunk-size und dem CRLF aufgefüllt.

Bei der Arbeit mit fsockopen und dergleichen, müssen Sie selbst mit dem HTTP-Protokoll umgehen... Was nicht immer so einfach ist, wie man vielleicht denkt ;-)

Eine Lösung, um zu vermeiden, dass man sich mit solchen Dingen beschäftigen muss, wäre die Verwendung von etwas wie locken. : es ist bereits conoce das HTTP-Protokoll - das heißt, Sie müssen das Rad nicht neu erfinden ;-)

0voto

Dennis Haarbrink Punkte 3670

Ich kann nichts Seltsames erkennen, das ein solches Verhalten verursachen könnte. Gibt es eine Möglichkeit, cURL zu verwenden, um dies für Sie zu tun? Das könnte das Problem ganz und gar lösen :)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X