PHP Conference Japan 2024

stream_get_contents

(PHP 5, PHP 7, PHP 8)

stream_get_contents讀取串流的剩餘部分到字串中

說明

stream_get_contents(資源 $stream, ?int $length = null, int $offset = -1): 字串|false

file_get_contents() 相同,不同之處在於 stream_get_contents() 作用於已開啟的串流資源,並以字串形式返回剩餘的內容,最多 length 位元組,並從指定的 offset 開始。

參數

stream (resource)

一個串流資源(例如從 fopen() 返回的)

length (int)

要讀取的最大位元組數。預設為 null(讀取所有剩餘的緩衝區)。

offset (int)

在讀取之前,搜尋到指定的偏移量。如果此數字為負數,則不會進行搜尋,讀取將從目前位置開始。

返回值

返回一個字串,失敗時返回 false

更新日誌

版本 說明
8.0.0 length 現在可以為 null。

範例

範例 #1 stream_get_contents() 範例

<?php

if ($stream = fopen('http://www.example.com', 'r')) {
// 從偏移量 10 開始印出整個頁面
echo stream_get_contents($stream, -1, 10);

fclose($stream);
}


if (
$stream = fopen('http://www.example.net', 'r')) {
// 印出前 5 個位元組
echo stream_get_contents($stream, 5);

fclose($stream);
}

?>

注意事項

注意此函式是二進位安全的。

注意:

當指定 length 值而不是 null 時,即使實際內容明顯較短,此函式也會立即分配該大小的內部緩衝區。

參見

  • fgets() - 從檔案指標取得一行
  • fread() - 二進位安全的檔案讀取
  • fpassthru() - 輸出檔案指標上的所有剩餘資料

新增註釋

使用者貢獻的註釋 2 則註釋

clarck dot smith at gmail dot com
12 年前
如果 stream_get_contents/fread/fgets 或其他串流讀取函式因為未達讀取位元組數限制而無限期阻塞您的腳本,請使用 socket_get_meta_data 函式來找出要讀取的位元組數。它會返回一個包含名為 'unread_bytes' 的鍵的陣列,然後將該數字傳遞給您慣用的串流讀取函式的第二個參數,以從串流中讀取。

或許一個好的解決方法是使用 stream_select 函式,並使用 stream_set_blocking($stream, 0) 將 socket 設定為非阻塞模式。在這種情況下,socket 讀取函式可以正常運作。

祝好,爾文
m rahman
13 年前
當省略參數 $maxlength 時,任何接收到的位元組都會堆疊起來,直到底層串流無法再讀取為止,然後該函式會一次性返回該堆疊。
To Top