CascadiaPHP 2024


(PHP 5, PHP 7, PHP 8)



stream_get_contents(resource $stream, ?int $length = null, int $offset = -1): string|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() 例子


if ($stream = fopen('', 'r')) {
// 打印从开始的位置偏移 10 个字节后页面的所有内容
echo stream_get_contents($stream, -1, 10);


if (
$stream = fopen('', 'r')) {
// 打印前 5 个字节
echo stream_get_contents($stream, 5);




注意: 此函数可安全用于二进制对象。


当指定一个非 nulllength 值时,即使实际内容要短得多,该函数也会立即分配一个内部缓冲区,其大小为指定的长度。


  • fgets() - 从文件指针中读取一行
  • fread() - 读取文件(可安全用于二进制文件)
  • fpassthru() - 输出文件指针处的所有剩余数据

add a note

User Contributed Notes 4 notes

vasiliy at hotger dot com
12 years ago
It is important to know that stream_get_contents behaves differently with different versions of PHP. Consider the following


= fopen('file', 'w+'); // truncate + attempt to create
fwrite($handle, '12345'); // file position > 0
rewind($handle); // position = 0
$content = stream_get_contents($handle); // file position = 0 in PHP 5.1.6, file position > 0 in PHP 5.2.17!
fwrite($handle, '6789');

* 'file' content
* PHP 5.1.6:
* 67895
* PHP 5.2.17:
* 123456789

As a result, stream_get_contents() affects file position in 5.1, and do not affect file position in 5.2 or better.
clarck dot smith at gmail dot com
12 years ago
In that case when stream_get_contents/fread/fgets or other stream reading functions block indefinitely your script because they don't reached the limit of bytes to read use the socket_get_meta_data function to figure out the number of the bytes to read. It returns an array that contains a key named 'unread_bytes' and then pass that number to your favourite stream reading functions second parameter to read from the stream.

Maybe a good workaround to use the stream_select function, and set the socket to non-blocking mode with the use of stream_set_blocking($stream, 0). In this case the socket reading functions work properly.

Cheers, Ervin
m rahman
13 years ago
When omitting the parameter $maxlength, any received bytes are stacked up until the underlying stream is not readable anymore, the the function returns that stack in one piece.
fearpro13 at gmail dot com
7 months ago
It states that $length parameter which value is null is intended to read all remaining contents from $stream
However, example listed under docs uses -1 as $length parameter to achieve such behavior

Recently i had to start few commands from php7.4 and read content from them, proc_open was used to create processes.
Both output[1] and error[2] pipes were set to non-blocking mode. For some unknown reason sometimes process error[2] channel was available, sometimes not(it was empty string).

After some investigation it was found that stream_get_contents works just great with -1 as a $length value instead of null if you are trying to get all remaining buffer.
To Top