1

stream_set_timeout() 是否有可能不起作用?我的功能(下面的代码)只要服务器需要回复。如果服务器需要 30 秒才能回复,该函数会耐心等待。我希望它在几秒钟后超时,函数应该返回 null 并且网站不应该加载超过 30 秒,而是告诉存在连接问题。我正在使用 PHP 5.4。

function request($json){
    $reply = null;
    $fp = @fsockopen("localhost", 1234, $errno, $errstr, 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;
}
4

1 回答 1

4

它不起作用,因为您没有检查返回值,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;
}
于 2013-08-21T06:17:38.747 回答