PHP 8.4.1 Released!

stream_set_timeout

(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)

stream_set_timeoutストリームにタイムアウトを設定する

説明

stream_set_timeout(resource $stream, int $seconds, int $microseconds = 0): bool

stream にタイムアウトの値を設定します。 この値は、secondsmicroseconds の和で表されます。

ストリームがタイムアウトとなった場合は、 stream_get_meta_data() が返す配列のキー 'timed_out' の値が true に設定されます。エラーや警告が発生していなくても同様になります。

パラメータ

stream

対象となるストリーム。

seconds

設定したいタイムアウトの秒数部分。

microseconds

設定したいタイムアウトのマイクロ秒数部分。

戻り値

成功した場合に true を、失敗した場合に false を返します。

例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
'Connection timed out!';
} else {
echo
$res;
}

}
?>

注意

注意:

この関数では、stream_socket_recvfrom() のような 高度な操作はできません。そのかわりに、timeout パラメータを指定して stream_select() を使用してください。

この関数は、以前は set_socket_timeout() 、その後は socket_set_timeout() と呼ばれたこともありましたが、 これらの利用は推奨されません。

参考

  • fsockopen() - インターネット接続もしくは Unix ドメインソケット接続をオープンする
  • fopen() - ファイルまたは URL をオープンする
add a note

User Contributed Notes 4 notes

up
25
hamishcool3 at yahoo dot co dot uk
14 years ago
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));
?>
up
1
burninleo at gmx dot net
8 years ago
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;
}
}
?>
up
1
emailfire at gmail dot com
13 years ago
This function seems to have no effect when running as a CLI script, see http://bugs.php.net/bug.php?id=36030
up
1
ridera
19 years ago
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.
To Top