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));
?>stream_set_timeout
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
stream_set_timeout
Референца за `function.stream-set-timeout.php` со подобрена типографија и навигација.
stream_set_timeout
(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
stream_set_timeout — Постави временски период на проток
= NULL
Поставува вредност за истек на време на stream, изразено во збирот на seconds and
microseconds.
Кога протокот ќе истече, клучот 'timed_out' од низот вратен од
stream_get_meta_data() е поставен на true, иако не се генерира грешка/предупредување.
Параметри
stream-
Поставете ја големината на делот од протокот.
seconds-
Дел од секундите од истекот на времето што треба да се постави.
microseconds-
Дел од микросекундите од истекот на времето што треба да се постави.
Вратени вредности
Патеката до PHP скриптата што треба да се провери. true на успех или false при неуспех.
Примери
Пример #1 stream_set_timeout() example
<?php
$fp = fsockopen("www.example.com", 80);
if (!$fp) {
echo "Unable to open\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 'Connection timed out!';
} else {
echo $res;
}
}
?>Белешки
Забелешка:
Оваа функција не работи со напредни операции како stream_socket_recvfrom(), користете stream_select() наместо со параметар за истек на време.
Оваа функција претходно се нарекуваше set_socket_timeout() а подоцна socket_set_timeout() но оваа употреба е застарена.
Види Исто така
- fsockopen() - Бинарно запишување во датотека
- fopen() - Отвора датотека или URL
Белешки од корисници 4 белешки
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;
}
}
?>This function seems to have no effect when running as a CLI script, see http://bugs.php.net/bug.php?id=36030