我在一个小的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);
答案 0 :(得分:2)
这看起来像HTTP Chunked transfer encoding - 这是HTTP将响应分段为几个小部分的方式;引用:
每个非空的块都以 它嵌入的数据的八位字节数 (接着是用十六进制写的大小) 由CRLF(回车和线路 feed)和数据本身。
大块 然后用CRLF关闭。
在某些方面 实现,白色空间 填充字符(0x20) chunk-size和CRLF。
使用fsockopen
之类的时候,你必须自己处理HTTP协议......这并不像人们想象的那么简单; - )
避免必须处理此类问题的解决方案是使用类似curl的内容:它已经知道 HTTP协议 - 这意味着您不必重新使用发明了一下; - )
答案 1 :(得分:0)
我没有看到任何可能导致这种行为的奇怪事件。有什么方法可以使用cURL为你做这个吗?它可能完全解决问题:)