PHP Conference Japan 2024

stream_set_timeout

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

stream_set_timeout設定串流的逾時時間

說明

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

設定 stream 的逾時值,以 secondsmicroseconds 的總和表示。

當串流逾時時,stream_get_meta_data() 返回的陣列中的 'timed_out' 鍵會被設定為 true,但不會產生錯誤/警告。

參數

stream

目標串流。

秒數

要設定的逾時秒數部分。

微秒

要設定的逾時微秒部分。

傳回值

成功時傳回 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
'連線逾時!';
} else {
echo
$res;
}

}
?>

注意事項

注意:

此函式不適用於像 stream_socket_recvfrom() 這樣的高級操作,請改用帶有逾時參數的 stream_select()

此函式先前稱為 set_socket_timeout(),後來稱為 socket_set_timeout(),但此用法已被棄用。

參見

  • fsockopen() - 開啟網際網路或 Unix 網域通訊端連線
  • fopen() - 開啟檔案或 URL
新增註解

使用者貢獻的註解 4 則註解

hamishcool3 at yahoo dot co dot uk
14 年前
如果有人感到困惑,stream_set_timeout 不適用於使用 socket_create 或 socket_accept 建立的通訊端。請改用 socket_set_option。

取代
<?php
stream_set_timeout
($socket,$sec,$usec);
?>

使用
<?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));
?>
burninleo at gmx dot net
8 年前
另一則註記已說明,如果對方回應非常緩慢,或者根本沒有回應,則阻塞式讀取可能會是個問題。在這種情況下,串流逾時可能無法如預期般運作。

然而,php.net 關於如何使用非阻塞式讀取操作的資訊非常少。以下是一個程式碼範例

<?php
stream_set_timeout
($c, $timeout);
$data = '';
while (
is_resource($c) && !feof($c)) {
// 使用非阻塞讀取第一次迴圈
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); // 注意:這可能需要調整
$str.= fgets($c, 515);
}
// 處理第一次讀取逾時
if (time() >= $endtimeOut) {
trigger_error('Timeout', E_USER_WARNING);
break;
}
stream_set_blocking($c, true);
} else {
$str = fgets($c, 515);
}
$data.= $str;

// 處理「傳統」逾時
$info = stream_get_meta_data($c);
if (
$info['timed_out']) {
trigger_error('Timeout', E_USER_WARNING);
break;
}
}
?>
emailfire at gmail dot com
13 年前
當程式以 CLI 腳本執行時,這個函式似乎沒有作用,詳見 http://bugs.php.net/bug.php?id=36030
ridera
19 年前
我發現需要加上

"stream_set_blocking($fp, FALSE )"

在任何 fgets()、fread() 等函式之前,以防止在呼叫遠端檔案且回應速度緩慢時程式卡住。
To Top