直到套接字超时才返回PHP正文

时间:2014-05-07 14:42:33

标签: php sockets http

[编辑:我正在尝试从PHP脚本向外部服务器发出HTTP请求。]

我正在使用http://php.net/manual/en/function.fsockopen.php修改为:

的示例1
<?php
$fp = fsockopen("m2.exosite.com", 80, $errno, $errstr, 30);
if (!$fp) {
    echo "$errstr ($errno)<br />\n";
} else {
    $out = "GET /api:v1/stack/alias?1 HTTP/1.1\r\n";
    $out .= "Host: m2.exosite.com\r\n";
    $out .= "X-Exosite-CIK: a32c85ba9dda45823be416246cf8b433baa068d7\r\n";
    $out .= "Accept: application/x-www-form-urlencoded; charset=utf-8\r\n\r\n";
    fwrite($fp, $out);
    while (!feof($fp)) {
        echo fgets($fp, 128);
    }
    fclose($fp);
}
?>

当我跑步时,我会在终端看到:

HTTP/1.1 200 OK
Date: Wed, 07 May 2014 13:51:40 GMT
Content-Length: 4
Connection: keep-alive
Server: nginx

<60 second pause>
1=37

然而,当我在wireshark中观看它时,我看到一个包含正文1=37的HTTP数据包在我看到终端中的标题的同时被发送。但是当服务器关闭套接字时我只看到终端中的主体(只是tcp [FIN,ACK],没有数据发送)。我认为这意味着响应的主体在某处陷入了PHP。是否有一些我需要做的才能让身体被读出来?

1 个答案:

答案 0 :(得分:2)

fgets的最后一次调用在等待换行符,要读取128个字符或默认超时到期时阻塞。之前的行已返回,因为它们以\n结尾。根据{{​​3}}:

  

读取长度 - 读取1个字节或换行时(或   包含在返回值中)或EOF(以先到者为准)。   如果没有指定长度,它将继续从流中读取,直到   它到了终点。

根据您的目的,您可以:

  • 发送标头Connection: close,以便服务器关闭连接,这将使最后fgets次呼叫返回。

  • 使用较小的超时值调用documentation for fgets(),以便客户端提前停止等待。