Ниже приведен мой код. Я хочу, чтобы 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.
Если вы прочитали руководство для 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); }