stream_set_timeout()在PHP中不起作用?

时间:2013-08-21 04:55:08

标签: php

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;
}

1 个答案:

答案 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;
}