(PHP 4 >= 4.3.0, PHP 5, PHP 7, PHP 8)
stream_set_timeout — ストリームにタイムアウトを設定する
 stream にタイムアウトの値を設定します。
 この値は、seconds と
 microseconds の和で表されます。
 
 ストリームがタイムアウトとなった場合は、
 stream_get_meta_data()  が返す配列のキー 'timed_out'
 の値が true  に設定されます。エラーや警告が発生していなくても同様になります。
 
stream対象となるストリーム。
seconds設定したいタイムアウトの秒数部分。
microseconds設定したいタイムアウトのマイクロ秒数部分。
例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() と呼ばれたこともありましたが、 これらの利用は推奨されません。
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));
?>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