file_get_contents

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

file_get_contents将整个文件读入字符串

说明

file_get_contents(
    字符串 $filename,
    布尔值 $use_include_path = false,
    ?资源 $context = null,
    整数 $offset = 0,
    ?整数 $length = null
): 字符串|false

此函数类似于 file(),但 file_get_contents() 将文件以 字符串 格式返回,从指定的 offset 开始,最多读取 length 字节。失败时,file_get_contents() 将返回 false

file_get_contents() 是将文件内容读入字符串的首选方式。如果您的操作系统支持,它将使用内存映射技术来提高性能。

注意:

如果您要打开包含特殊字符(例如空格)的 URI,则需要使用 urlencode() 对 URI 进行编码。

参数

filename

要读取的文件的名称。

use_include_path

注意:

FILE_USE_INCLUDE_PATH 常量可用于触发 包含路径 搜索。如果启用了 严格类型,则无法执行此操作,因为 FILE_USE_INCLUDE_PATH 是一个 整数。请改用 true

context

使用 stream_context_create() 创建的有效上下文资源。如果您不需要使用自定义上下文,则可以使用 null 跳过此参数。

offset

在原始流上开始读取的偏移量。负偏移量从流的末尾开始计数。

远程文件不支持寻址(offset)。尝试对非本地文件进行寻址可能在小偏移量的情况下有效,但这不可预测,因为它是在缓冲流上进行的。

length

读取数据的最大长度。默认情况下读取到文件末尾。请注意,此参数适用于经过过滤器处理的流。

返回值

该函数返回读取的数据或失败时返回 false

警告

此函数可能会返回布尔值 false,但它也可能会返回一个非布尔值,该值计算结果为 false。有关详细信息,请阅读有关 布尔值 的部分。使用 === 运算符 来测试此函数的返回值。

错误/异常

如果找不到 filenamelength 小于零,或者在流中寻求指定的 offset 失败,则会生成 E_WARNING 级别的错误。

file_get_contents() 在目录上调用时,在 Windows 上会生成 E_WARNING 级别的错误,从 PHP 7.4 开始,在其他操作系统上也会生成此错误。

变更日志

版本 说明
8.0.0 length 现在可以为空。
7.1.0 已添加对负 offset 的支持。

示例

示例 #1 获取并输出网站主页面的源代码

<?php
$homepage
= file_get_contents('http://www.example.com/');
echo
$homepage;
?>

示例 #2 在 include_path 中搜索

<?php
// 如果启用了严格类型,例如 declare(strict_types=1);
$file = file_get_contents('./people.txt', true);
// 否则
$file = file_get_contents('./people.txt', FILE_USE_INCLUDE_PATH);
?>

示例 #3 读取文件的一部分

<?php
// 从第 21 个字符开始读取 14 个字符
$section = file_get_contents('./people.txt', FALSE, NULL, 20, 14);
var_dump($section);
?>

上面的示例将输出类似于

string(14) "lle Bjori Ro"

示例 #4 使用流上下文

<?php
// 创建一个流
$opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Accept-language: en\r\n" .
"Cookie: foo=bar\r\n"
)
);

$context = stream_context_create($opts);

// 使用上面设置的 HTTP 标头打开文件
$file = file_get_contents('http://www.example.com/', false, $context);
?>

注释

注意: 此函数是二进制安全的。

提示

如果启用了 fopen 包装器,则可以使用 URL 作为此函数的文件名。有关如何指定文件名的详细信息,请参阅 fopen()。有关各种包装器具有的功能、用法说明以及它们可能提供的任何预定义变量的信息,请参阅 支持的协议和包装器

警告

当使用 SSL 时,Microsoft IIS 会违反协议,在没有发送 close_notify 指示的情况下关闭连接。PHP 在您到达数据末尾时会将其报告为“SSL: Fatal Protocol Error”。为了解决这个问题,error_reporting 的值应该降低到不包含警告的级别。当您使用 https:// 包装器打开流时,PHP 可以检测到有问题的 IIS 服务器软件,并且会抑制警告。当使用 fsockopen() 创建 ssl:// 套接字时,开发人员负责检测和抑制此警告。

另请参见

添加注释

用户贡献的注释 8 notes

Bart Friederichs
12 年前
file_get_contents 可以执行 POST,首先为此创建一个上下文

<?php

$opts
= array('http' =>
array(
'method' => 'POST',
'header' => "Content-Type: text/xml\r\n".
"Authorization: Basic ".base64_encode("$https_user:$https_password")."\r\n",
'content' => $body,
'timeout' => 60
)
);

$context = stream_context_create($opts);
$url = 'https://'.$https_server;
$result = file_get_contents($url, false, $context, -1, 40000);

?>
KC
8 个月前
如果要执行负偏移量以获取文件的末尾,并且文件比偏移量短,则 file_get_contents( ) 将返回 false。

如果希望它在文件比负偏移量短时仅返回可用的内容,则可以重试。

例如...

$contents = file_get_contents( $log_file, false, null, -4096 ); // 获取最后 4KB

if ( false === $contents ) {
// 可能出错,或者文件大小小于 4KB。

$contents = file_get_contents( $log_file, false, null );

if ( false === $contents ) {
// 处理真正的错误。
}
}
brentcontact at daha dot us
1 年前
为了防止混合内容,大多数浏览器/函数将在您只指定 // 而不是 http://https://. 的情况下使用已使用的协议。file_get_contents 不是这种情况。您必须指定协议。

这不起作用
<?php
$jsonData
= file_get_contents('//example.com/file.json');
print
$jsonData;
?>

仅指定 'example.com/file.json' 而不带双斜杠也不起作用。

在 Apache 2.4 上运行时,使用 $_SERVER['REQUEST_SCHEME'] 是更好的方法,可以与协议无关。
<?php
$jsonData
= file_get_contents($_SERVER['REQUEST_SCHEME'].'://example.com/file.json');
print
$jsonData;
?>

如果使用其他 Web 服务器,您可能需要以其他方式获取协议或将其硬编码。
daniel at dangarbri dot tech
1 年前
请注意,如果 HTTP 请求失败但仍然具有响应正文,则结果仍然是 false,而不是响应正文,响应正文可能包含有关请求失败原因的更多详细信息。
soger
1 年前
此页面几乎没有提及,但如果您的文件是链接,$http_response_header 将填充 HTTP 标头。例如,如果您期望一张图片,您可以这样做

<?php
$data
= file_get_contents('https://example.net/some-link');

$mimetype = null;
foreach (
$http_response_header as $v) {
if (
preg_match('/^content\-type:\s*(image\/[^;\s\n\r]+)/i', $v, $m)) {
$mimetype = $m[1];
}
}

if (!
$mimetype) {
// 不是图片
}
Anonymous
2 年前
如果连接是
content-encoding: gzip
并且您需要手动对其进行解压缩,这显然是关键
$c=gzinflate( substr($c,10,-8) );
(从网上偷来的)
453034559 at qq dot com
2 年前
//从指定位置获取指定长度的文件内容
function file_start_length($path,$start=0,$length=null){
if(!file_exists($path)) return false;
$size=filesize($path);
if($start<0) $start+=$size;
if($length===null) $length=$size-$start;
return file_get_contents($path, false, null, $start, $length );
}
allenmccabe at gmail dot com
3 年前
我不确定为什么 @jlh 被降级,但我验证了他报告的内容。

>>> file_get_contents($path false, null, 5, null)
=> ""
>>> file_get_contents($path, false, null, 5, 5)
=> "r/bin"
To Top