stream_set_timeout
(PHP 4 >= 4.3.0, PHP 5)
stream_set_timeout — Устанавливает значение тайм-аута на потоке
Описание
$stream
, int $seconds
[, int $microseconds
= 0
] )
Устанавливает значение тайм-аута на потоке stream
,
равное сумме параметров seconds
и
microseconds
.
Когда время работы потока истекает, ключ 'timed_out' массива, возвращаемого
функцией stream_get_meta_data(), устанавливается в значение TRUE
, хотя
ошибка или предупреждение не генерируется.
Список параметров
-
stream
-
Целевой поток.
-
seconds
-
Секунды в устанавливаемом тайм-ауте.
-
microseconds
-
Микросекунды в устанавливаемом тайм-ауте.
Возвращаемые значения
Возвращает TRUE
в случае успешного завершения или FALSE
в случае возникновения ошибки.
Список изменений
Версия | Описание |
---|---|
4.3.0 | Начиная с PHP 4.3 эта функция может (потенциально) работать на любом типе потока. В PHP 4.3 потоки, основанные на сокетах - это единственный тип потоков, поддерживаемый в ядре PHP, хотя потоки из других расширений могут поддерживать эту функцию. |
Примеры
Пример #1 Пример использования stream_set_timeout()
<?php
$fp = fsockopen("www.example.com", 80);
if (!$fp) {
echo "Невозможно открыть сокет\n";
} else {
fwrite($fp, "GET / HTTP/1.0\r\n\r\n");
stream_set_timeout($fp, 2);
$res = fread($fp, 2000);
$info = stream_get_meta_data($fp);
fclose($fp);
if ($info['timed_out']) {
echo 'Истекло время соединения!';
} else {
echo $res;
}
}
?>
Примечания
Замечание:
Эта функция не работает с продвинутыми операциями, такими, как stream_socket_recvfrom(). Используйте вместо неё stream_select() с параметром тайм-аута
Эта функция раньше вызывалась через set_socket_timeout() и позднее через socket_set_timeout(), но это использование устарело.
Смотрите также
- fsockopen() - Открывет соединение с интернет сокетом или доменным сокетом Unix
- fopen() - Открывает файл или URL
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Другие базовые расширения
- Потоки
- set_socket_blocking
- stream_bucket_append
- stream_bucket_make_writeable
- stream_bucket_new
- stream_bucket_prepend
- stream_context_create
- stream_context_get_default
- stream_context_get_options
- stream_context_get_params
- stream_context_set_default
- stream_context_set_option
- stream_context_set_params
- stream_copy_to_stream
- stream_encoding
- stream_filter_append
- stream_filter_prepend
- stream_filter_register
- stream_filter_remove
- stream_get_contents
- stream_get_filters
- stream_get_line
- stream_get_meta_data
- stream_get_transports
- stream_get_wrappers
- stream_is_local
- stream_notification_callback
- stream_register_wrapper
- stream_resolve_include_path
- stream_select
- stream_set_blocking
- stream_set_chunk_size
- stream_set_read_buffer
- stream_set_timeout
- stream_set_write_buffer
- stream_socket_accept
- stream_socket_client
- stream_socket_enable_crypto
- stream_socket_get_name
- stream_socket_pair
- stream_socket_recvfrom
- stream_socket_sendto
- stream_socket_server
- stream_socket_shutdown
- stream_supports_lock
- stream_wrapper_register
- stream_wrapper_restore
- stream_wrapper_unregister
Коментарии
I have found it required to add
"stream_set_blocking($fp, FALSE )"
prior to any fgets(), fread(), etc. to prevent the code from hanging up when remote files are called and the response is slow.
In case anyone is puzzled, stream_set_timeout DOES NOT work for sockets created with socket_create or socket_accept. Use socket_set_option instead.
Instead of:
<?php
stream_set_timeout($socket,$sec,$usec);
?>
Use:
<?php
socket_set_option($socket, SOL_SOCKET, SO_RCVTIMEO, array('sec'=>$sec, 'usec'=>$usec));
socket_set_option($socket, SOL_SOCKET, SO_SNDTIMEO, array('sec'=>$sec, 'usec'=>$usec));
?>
This function seems to have no effect when running as a CLI script, see http://bugs.php.net/bug.php?id=36030
Another note alread states that blocking-reads may be an issue, if the counterpart responds very slowly - or not at all. The stream timeout may not work as expected in such a situation.
However, php.net provides very little information on how to use non-blocking reading operations. Here's a code sample:
<?php
stream_set_timeout($c, $timeout);
$data = '';
while (is_resource($c) && !feof($c)) {
// Use non-blocking reading for first loop
if (($data === '') and ($timeout > 0)) {
stream_set_blocking($c, false);
$endtimeOut = time() + $timeout;
$str = '';
while ((time() < $endtimeOut) and (strlen($str) < 515) and !feof($c)) {
sleep(1); // Note: This may require tuning
$str.= fgets($c, 515);
}
// Handling first-read timeout
if (time() >= $endtimeOut) {
trigger_error('Timeout', E_USER_WARNING);
break;
}
stream_set_blocking($c, true);
} else {
$str = fgets($c, 515);
}
$data.= $str;
// Handling of "traditional" timeout
$info = stream_get_meta_data($c);
if ($info['timed_out']) {
trigger_error('Timeout', E_USER_WARNING);
break;
}
}
?>