stream_set_timeout()是否有可能不起作用?只要服务器需要回复,我的功能(代码如下)就会占用。如果服务器需要30秒才能回复,该功能将耐心等待。我希望它在几秒钟后超时,该函数应该返回null并且网站不应该加载超过30秒而是告诉存在连接问题。 我使用的是PHP 5.4。
function request($json){
$reply = null;
$fp = @fsockopen("localhost", 1234, $errstr, $errno, 2);
if(!$fp){
return null;
}
fputs($fp, $json."\r");
stream_set_timeout($fp, 2);
// stream_set_blocking($fp, true); <-- I've read in a related SO question that this might help. It doesn't.
for($i=0; !feof($fp); $i++){
$reply = fgets($fp);
}
fclose($fp);
return $reply;
}
答案 0 :(得分:3)
它不起作用,因为您没有检查fgets()
的返回值,也没有检查套接字元数据。发生超时时,套接字不会被标记为EOF。
以下代码应该更适合您:
$i = 0;
while (!feof($fp)) {
if (($reply = fgets($fp)) === false) {
$info = stream_get_meta_data($fp);
if ($info['timed_out']) {
// timed out
} else {
// some other error
}
}
++$i;
}