[编辑:我正在尝试从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。是否有一些我需要做的才能让身体被读出来?
答案 0 :(得分:2)
对fgets
的最后一次调用在等待换行符,要读取128个字符或默认超时到期时阻塞。之前的行已返回,因为它们以\n
结尾。根据{{3}}:
读取长度 - 读取1个字节或换行时(或 包含在返回值中)或EOF(以先到者为准)。 如果没有指定长度,它将继续从流中读取,直到 它到了终点。
根据您的目的,您可以:
发送标头Connection: close
,以便服务器关闭连接,这将使最后fgets
次呼叫返回。
使用较小的超时值调用documentation for fgets()
,以便客户端提前停止等待。