CascadiaPHP 2024

file_get_contents

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

file_get_contentsЧитает содержимое файла в строку

Описание

file_get_contents(
    string $filename,
    bool $use_include_path = false,
    ?resource $context = null,
    int $offset = 0,
    ?int $length = null
): string|false

Функция похожа на функцию file(), за исключением того, что функция file_get_contents() возвращает содержимое файла в строке длиной length байтов со смещения offset. В случае неудачи функция file_get_contents() вернёт false.

Вызов функции file_get_contents() наиболее предпочтителен, когда требуется получить содержимое файла целиком, поскольку для улучшения производительности функция использует технику отображения файла в памяти (memory mapping), если операционная система её поддерживает.

Замечание:

Если открывается URI, который содержит спецсимволы наподобие пробела, нужно закодировать URI функцией urlencode().

Список параметров

filename

Имя читаемого файла.

use_include_path

Замечание:

Разрешается указывать константу FILE_USE_INCLUDE_PATH для поиска файла в списке путей include path. Обратите внимание, в коде со строгой типизацией так сделать не получится, потому что значение константы FILE_USE_INCLUDE_PATH принадлежит типу int. Тогда лучше задать true.

context

Корректный ресурс контекста, который возвращает функция stream_context_create(). Чтобы пропустить параметр, в него передают значение null, когда особый контекст не нужен.

offset

Смещение, с которого начнётся чтение оригинального потока. Отрицательное значение смещения будет отсчитываться с конца потока.

Поиск смещения (offset) не поддерживается при работе с удалёнными файлами. Попытка поиска смещения на нелокальных файлах может работать при небольших смещениях, но результат будет непредсказуемым, так как функция работает на буферизованном потоке.

length

Максимальный размер читаемых данных. По умолчанию чтение осуществляется пока не будет достигнут конец файла. Учтите, что этот параметр применяется и к потоку с фильтрами.

Возвращаемые значения

Функция возвращает прочтённые данные или false, если возникла ошибка.

Внимание

Функция возвращает как логическое значение false, так и нелогическое значение, которое приводится к false. Прочитайте раздел «Логический тип», чтобы получить дополнительную информацию. Используйте оператор === для проверки значения, которое возвращает функция.

Ошибки

Функция выдаёт ошибку уровня E_WARNING, если не получится найти файл filename, для параметра length задали значение меньше нуля или поиск по смещению offset в потоке завершится неудачно.

Когда функция file_get_contents() вызывается для каталога, в ОС Windows генерируется ошибка уровня E_WARNING, а с PHP 7.4 и в других операционных системах.

Список изменений

Версия Описание
8.0.0 Параметр length теперь принимает значение null.
7.1.0 Добавили поддержку отрицательных значений для смещения offset.

Примеры

Пример #1 Пример получения и вывода исходного кода домашней страницы сайта

<?php

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

?>

Пример #2 Поиск файлов в include_path

<?php

// Если включили строгую типизацию, то есть объявили (strict_types=1);
$file = file_get_contents('./people.txt', true);

// Иначе
$file = file_get_contents('./people.txt', FILE_USE_INCLUDE_PATH);

?>

Пример #3 Чтение секции файла

<?php

// Читаем 14 символов, начиная с 21 символа
$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);

?>

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Подсказка

В эту функцию в качестве имени файла можно передавать URL-адреса, если была включена директива fopen wrappers. Подробнее о том, как указать имя файла, рассказано в описании функции fopen(). В разделе «Протоколы и обёртки» также даны ссылки на информацию о способностях поддерживаемых обёрток, замечания по работе с ними и список предопределённых переменных, которые они дают.

Внимание

При работе с сервером Microsoft IIS по SSL-протоколу разработчик сталкивается с тем, что IIS-сервер нарушает протокол путём закрытия соединения без отправки индикатора close_notify. PHP выдаст ошибку в виде сообщения «SSL: Fatal Protocol Error» при достижении конца данных. Чтобы избежать такого поведения, значение директивы error_reporting снижают до уровня, который не включает предупреждений уровня E_WARNING. PHP умеет обнаруживать ошибочное программное обеспечение IIS-сервера при открытии потока через обёртку https://, и подавляет предупреждение. За обнаружение и подавление предупреждения отвечает разработчик, который вызывает функцию fsockopen(), чтобы создать сокет ssl://.

Смотрите также

  • file() - Читает содержимое файла и помещает его в массив
  • fgets() - Получает строку из указателя на файл
  • fread() - Читает файл в бинарно-безопасном режиме: как последовательность байтов
  • readfile() - Выводит файл
  • file_put_contents() - Записывает данные в файл
  • stream_get_contents() - Читает оставшуюся часть потока в строку
  • stream_context_create() - Создаёт контекст потока
  • $http_response_header

add a note

User Contributed Notes 8 notes

up
35
Bart Friederichs
12 years ago
file_get_contents can do a POST, create a context for that first:

<?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);

?>
up
4
KC
7 months ago
If doing a negative offset to grab the end of a file and the file is shorter than the offset, then file_get_contents( ) will return false.

If you want it to just return what is available when the file is shorter than the negative offset, you could try again.

For example...

$contents = file_get_contents( $log_file, false, null, -4096 ); // Get last 4KB

if ( false === $contents ) {
// Maybe error, or maybe file less than 4KB in size.

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

if ( false === $contents ) {
// Handle real error.
}
}
up
3
brentcontact at daha dot us
11 months ago
To prevent mixed content most browsers/functions will use the protocol already used if you specify only // instead of http:// or https://. This is not the case with file_get_contents. You must specify the protocol.

This does not work:
<?php
$jsonData
= file_get_contents('//example.com/file.json');
print
$jsonData;
?>

Specifying only 'example.com/file.json' without the double slash does not work either.

When running on Apache 2.4 , using $_SERVER['REQUEST_SCHEME'] is a better way to be protocol agnostic.
<?php
$jsonData
= file_get_contents($_SERVER['REQUEST_SCHEME'].'://example.com/file.json');
print
$jsonData;
?>

If using another web server, you may have to get the protocol another way or hard code it.
up
-1
daniel at dangarbri dot tech
1 year ago
Note that if an HTTP request fails but still has a response body, the result is still false, Not the response body which may have more details on why the request failed.
up
-4
soger
1 year ago
There's barely a mention on this page but the $http_response_header will be populated with the HTTP headers if your file was a link. For example if you're expecting an image you can do this:

<?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) {
// not an image
}
up
-21
Anonymous
2 years ago
if the connection is
content-encoding: gzip
and you need to manually ungzip it, this is apparently the key
$c=gzinflate( substr($c,10,-8) );
(stolen from the net)
up
-27
453034559 at qq dot com
2 years ago
//从指定位置获取指定长度的文件内容
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 );
}
up
-32
allenmccabe at gmail dot com
2 years ago
I'm not sure why @jlh was downvoted, but I verified what he reported.

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