检测HTTP数据包的结尾

时间:2010-09-15 13:38:48

标签: php http sockets

我必须编写一个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

5 个答案:

答案 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)

当实体结束时,要么遵守:

如果你得到这个标题,你可能必须处理这个分块传输编码。有图书馆可以这样做。

答案 4 :(得分:0)

feof($sock)没关系