不斷髮送一些數據點(每秒一次),在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秒鐘的掛起。任何幫助讚賞。