不断发送一些数据点(每秒一次),在PHP中使用无限循环的POST请求。数据非常依赖于时间。如果发生超时,我不关心丢失的数据,我只想快速转到下一个数据点。fsockopen()超时有时不起作用
我最初使用file_get_contents()
(超时值为1)来做这个POST请求,但我有一些问题,它应该已超时,而不是。我读了很多关于这个的问题,普遍的共识是,file_get_contents()
超时没有被触发,因为它是一个读取超时,而不是一个连接超时。
我也读过,套接字有两种超时,所以我改变了代码使用fsockopen()
来代替。一个片段包含在下面。
// waaaay up at the top of the file
ini_set("default_socket_timeout", 1); // set default socket connect timeout
//...
// inside the loop
echo("4...");
$url = 'othersite.ie';
$fp = fsockopen($url, 80, $errno, $errstr, 1); // connect timeout of 1
if(!$fp)
{
echo($errno .": ". $errstr);
}
else
{
echo("5...");
stream_set_timeout($fp, 1, 0); // read timeout of 1
$content = http_build_query($data); // array assembled before this snippet
fwrite($fp, "POST /some/address/at/url HTTP/1.1\r\n");
fwrite($fp, "Host: www.examplesite.ie\r\n");
fwrite($fp, "Content-Type: application/x-www-form-urlencoded\r\n");
fwrite($fp, "Content-Length: ".strlen($content)."\r\n");
fwrite($fp, "Connection: close\r\n");
fwrite($fp, "\r\n");
fwrite($fp, $content);
while(!feof($fp))
{
$result = $result . fgets($fp, 1024);
}
echo("6...");
if (empty($result))
{
echo("No result");
}
}
这似乎并没有帮助,虽然。我添加了一些echo
陈述,所以如果我正在观看输出结果,我可以看到延迟发生的位置,它总是在“4 ...”和“5 ...”之间。每个延迟大约十秒钟,而且他们似乎没有任何特定的顺序。大部分时间(超过99%)连接起作用,读取起作用,并且我将数据发送到服务器。但重要的是至少要试图消除这些10秒钟的挂起。任何帮助赞赏。