【问题标题】:Rare strange readings with fsockopenfsockopen 罕见的奇怪读数
【发布时间】:2011-03-15 19:56:38
【问题描述】:

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

zh语言>
 每小时1

11
 
  
1f
2010 年 7 月 8 日
  
32
http://darkencomic.com/?p=2406
  
3e

但是当我打开提要时,例如notepad++,效果很好,显示:

zh语言>
 每小时12010 年 7 月 8 日http://darkencomic.com/?p=2406
  

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

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

【问题讨论】:

    标签: php fsockopen


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      这看起来像HTTP Chunked transfer encoding——这是 HTTP 将响应分成几个小部分的一种方式;引用:

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


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

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

      【讨论】:

      • 呵呵,但我喜欢重新发明轮子! ;) 感谢您提供的信息,这对您有很大帮助!
      • 好吧,重新发明轮子会很有趣——如果你有很多时间 ;-) ;;不客气:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2012-04-29
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多