与fsockopen罕见的奇怪读物

时间:2010-07-14 12:23:34

标签: php 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

但是当我打开饲料时,例如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 ".$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 个答案:

答案 0 :(得分:2)

这看起来像HTTP Chunked transfer encoding - 这是HTTP将响应分段为几个小部分的方式;引用:

  

每个非空的块都以   它嵌入的数据的八位字节数   (接着是用十六进制写的大小)   由CRLF(回车和线路   feed)和数据本身。
大块   然后用CRLF关闭。
在某些方面   实现,白色空间   填充字符(0x20)   chunk-size和CRLF。


使用fsockopen之类的时候,你必须自己处理HTTP协议......这并不像人们想象的那么简单; - )

避免必须处理此类问题的解决方案是使用类似curl的内容:它已经知道 HTTP协议 - 这意味着您不必重新使用发明了一下; - )

答案 1 :(得分:0)

我没有看到任何可能导致这种行为的奇怪事件。有什么方法可以使用cURL为你做这个吗?它可能完全解决问题:)