我必须编写一个PHP脚本,作为另一个HTTP Server的客户端。此服务器忽略HTTP Connection:Close标头并保持TCP连接打开,除非客户端关闭它。这就是我的困境。我(客户端)必须在HTTP请求/响应完成后拒绝,然后关闭连接。只需使用:
$ data = file_get_contents($ url);
..将无效,因为只有在达到连接超时(默认为30秒)时,file_get_contents才会返回。
所以我必须像这样编写自己的读循环(伪代码):
$sock = fsockopen(...);
$data = '';
while($line = fgets($sock)) {
$data .= $line;
if(http_package_recieved()) {
break;
}
}
不幸的是,响应中没有Content-Length标头。我的问题是,功能如何
http_package_recieved()
......应该看起来像。
电贺 的Thorsten
答案 0 :(得分:3)
您可以检查$ line是否为空,以查看服务器是否未发送任何内容。您还可以使用stream_set_timeout()
在套接字上设置一个小的读取超时,然后在循环内部检查stream_get_meta_data()
以查看是否已到达以便突破。
答案 1 :(得分:2)
您最好使用库(例如cURL(http://uk.php.net/manual/en/intro.curl.php))来处理此问题。 HTTP规范并不简单:http://tools.ietf.org/html/rfc2616(参见第4.4节),您可能会错过一些至关重要的内容。
答案 2 :(得分:2)
如果它没有关闭连接和,它不会告诉您响应的总长度,您无法知道是否已收到所有数据。
您可以指定数据包之间的最大时间间隔,但这不可靠。
答案 3 :(得分:1)
当实体结束时,要么遵守:
Content-Length
标题(您没有)Transfer-Encoding: chunked
标题:你有其中一个吗?)。如果你得到这个标题,你可能必须处理这个分块传输编码。有图书馆可以这样做。
答案 4 :(得分:0)
feof($sock)
没关系