stream_get_contents

(PHP 5, PHP 7, PHP 8)

stream_get_contents将流的剩余部分读入字符串

描述

stream_get_contents(资源 $stream, ?整数 $length = null, 整数 $offset = -1): 字符串|false

file_get_contents() 相同,但 stream_get_contents() 操作的是已打开的流资源,并将剩余的内容作为字符串返回,最多 length 字节,并从指定的 offset 开始。

参数

stream (资源)

一个流资源(例如,由 fopen() 返回)

length (整数)

要读取的最大字节数。默认为 null(读取所有剩余缓冲区)。

offset (整数)

在读取之前寻求到指定的偏移量。如果此数字为负数,则不会进行查找,并且读取将从当前位置开始。

返回值

返回一个字符串,如果失败则返回 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() - 输出文件指针上的所有剩余数据

添加注释

用户贡献注释 4 个注释

17
vasiliy at hotger dot com
12 年前
重要的是要知道 stream_get_contents 在不同版本的 PHP 中的行为有所不同。请考虑以下情况

<?php

$handle
= fopen('file', 'w+'); // 截断 + 尝试创建
fwrite($handle, '12345'); // 文件位置 > 0
rewind($handle); // 位置 = 0
$content = stream_get_contents($handle); // 文件位置 = 0 在 PHP 5.1.6 中,文件位置 > 0 在 PHP 5.2.17 中!
fwrite($handle, '6789');
fclose($handle);

/**
*
* 'file' 内容
*
* PHP 5.1.6:
* 67895
*
* PHP 5.2.17:
* 123456789
*
*/
?>

因此,stream_get_contents() 在 5.1 中影响文件位置,而在 5.2 或更高版本中不影响文件位置。
12
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)。在这种情况下,套接字读取函数将正常工作。

干杯,Ervin
4
m rahman
13 年前
当省略参数 $maxlength 时,任何接收到的字节都会堆积起来,直到底层流不再可读,然后函数以一个整体形式返回该堆栈。
-1
fearpro13 at gmail dot com
8 个月前
它指出 $length 参数的值为 null 用于读取 $stream 中所有剩余内容
然而,文档中列出的示例使用 -1 作为 $length 参数来实现这种行为

最近我不得不从 php7.4 开始执行一些命令并从它们中读取内容,使用 proc_open 创建进程。
output[1] 和 error[2] 管道都设置为非阻塞模式。出于某种未知原因,有时进程 error[2] 通道可用,有时不可用(它是空字符串)。

经过一番调查,发现如果您试图获取所有剩余缓冲区,stream_get_contents 在使用 -1 作为 $length 值而不是 null 时工作得很好。
To Top