2

我在一个小型 cronjob 上使用 fsockopen 来读取和解析不同服务器上的提要。在过去,这非常有效。然而在某些服务器上,我在响应中得到了非常奇怪的行,如下所示:

<语言>zh</语言>
 <sy:updatePeriod>每小时</sy:updatePeriod>
 <sy:updateFrequency>1</sy:updateFrequency>

11
 <项目>
  <标题>
1f
2010 年 7 月 8 日</title>
  <链接>
32
http://darkencomic.com/?p=2406</link>
  <评论>
3e

但是当我在例如记事本++中打开提要时,它工作得很好,显示:

<语言>zh</语言>
 <sy:updatePeriod>每小时</sy:updatePeriod>
 <sy:updateFrequency>1</sy:updateFrequency>
   <项目>
  <title>2010 年 7 月 8 日</title>
  <link>http://darkencomic.com/?p=2406</link>
  <评论>

...只是为了显示摘录。那么,我在这里做错了什么还是超出了我的控制范围?我很感激任何解决这个问题的想法。这是我用来检索提要的部分代码:

$fp = @fsockopen($url["host"], 80, $errno, $errstr, 5);
  如果 (!$fp) {
   throw new UrlException("($errno) $errstr ~~~ on opening ".$url["host"]." ");
  } 别的 {
   $out = "GET ".$path." HTTP/1.1\r\n"
     ."主机:".$url["主机"]。"\r\n"
     ."连接:关闭\r\n\r\n";
   fwrite($fp, $out);
   $内容 = '';
   而 (!feof($fp)) {
    $contents .= stream_get_contents($fp,128);
   }
   fclose($fp);
4

2 回答 2

2

这看起来像HTTP Chunked 传输编码——这是 HTTP 将响应分割成几个小部分的一种方式;引用:

每个非空块都以它嵌入的数据的八位字节数(以十六进制写入的大小)开头,然后是 CRLF(回车和换行)和数据本身。
然后用 CRLF 关闭块。
在一些实现中,空白字符 (0x20) 在块大小和 CRLF 之间填充。


在使用fsockopen等时,您必须自己处理 HTTP 协议......这并不总是像人们想象的那么容易;-)

避免处理此类问题的解决方案是使用curl之类的东西:它已经知道HTTP 协议——这意味着您不必重新发明 ;-)

于 2010-07-14T12:27:20.187 回答
0

我没有看到任何可能导致这种行为的奇怪现象。有什么方法可以使用 cURL 为您执行此操作吗?它可能会完全解决问题:)

于 2010-07-14T12:26:07.277 回答