在 PHP 中使用无限循环的 POST 请求不断发送一些数据点(目标是每秒一次)。数据高度依赖时间。如果超时,我不关心丢失的数据,我只想快速移动到下一个数据点。
我最初使用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 秒的挂起。任何帮助表示赞赏。