Как можно установить тайм-аут для фреда при доступе к сокету? - PullRequest
1 голос
/ 13 октября 2011

Ниже приведен мой код.Я хотел бы, чтобы fread мог вернуться, когда через несколько секунд не было данных для чтения.Я назвал stream_set_timeout.Но это не работает.И я тоже вызвал stream_get_meta_data.Мне это пока не нужно.Я подключаюсь к chat.facebook.com.

$fp = fsockopen($server, 8888, $errno, $errstr);

stream_socket_enable_crypto($fp, true, STREAM_CRYPTO_METHOD_TLS_CLIENT);

fwrite($fp, $xml);

stream_set_timeout($fp, 5);

$str = fread($fp,8192);//This code will hang when there don't have data to read.

1 Ответ

1 голос
/ 13 октября 2011

Если бы вы прочитали руководство для stream_set_timeout(), вы бы знали, что единственное, что stream_set_timeout() делает в случае тайм-аута, это установка ключа 'timed_out' массива, возвращаемого stream_get_meta_data(), в true.*

stream_set_timeout($fp, 5);
// set stream into non-blocking mode
stream_set_blocking($fp, false);

$break_counter = 0;
$result = '';
$info = stream_get_meta_data($fp);

while (!$info['timed_out'] && !feof($fp)) {
    $str = @fgets($fp, 1160);
    if ($str) {
        $result .= $str;
    } else {
        $break_counter += 1;

        if ($break_counter > 100) {
            break;
        }

        // 10000*100 microseconds gives you one second
        usleep(10000);
    }
    $info = stream_get_meta_data($fp);
}
...