PHP 8.4.2 Released!

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 = ?,
    int $offset = -1,
    int $maxlen = ?
): string

Ця функція є подібною до функціїfile(), за виключенням того, що file_get_contents() повертає вміст файлу рядком (string), починаючи від зазначеного зміщення (offset), обмежуючись параметром максимальної довжини (maxlen) в байтах. При невдачі, file_get_contents() повертає false.

file_get_contents() є кращим варіантом для читання вмісту файла в рядку. Вона буде використовувати технологію співставлення в пам'яті, якщо це підтримується вашою ОС для збільшення продуктивності.

Зауваження:

Якщо ви відкриваєте URI, що мають спец-символи, такі як пробіли, вам потрібно закодовувати URI за допомогою urlencode().

Параметри

filename

Назва файлу, який буде читатись.

use_include_path

Зауваження:

Починаючи з PHP 5 може використовуватись константа FILE_USE_INCLUDE_PATH для ініціювання пошуку в підключеному розташуванні (include path).

context

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

offset

Зміщення, з якого починається читання в наданому потоці.

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

maxlen

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

Значення, що повертаються

Функція повертає прочитані дані або false в разі помилки.

Увага

Ця функція може повертати як логічне false, так і не логічне значення, яке прирівнюється до false. Докладніше про це описано в розділі Логічні типи даних. Для перевірки значення, яке повертає ця функція, використовується оператор ===.

Помилки/виключення

Буде згенеровано помилку рівня E_WARNING, якщо файл (filename) не знайдено, максимальна довжина (maxlength) менша за нуль, або якщо відбулась невдала спроба зазначеного зміщення (offset) в потоці.

Приклади

Приклад #1 Отримання та вивід сирців домашньої сторінки веб-сайта

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

Приклад #2 Пошук всередині підключеного розміщення (include_path)

<?php
// <= PHP 5
$file = file_get_contents('./people.txt', true);

// > PHP 5
$file = file_get_contents('./people.txt', FILE_USE_INCLUDE_PATH);
?>

Приклад #3 Читання частини файла

<?php
// Читання 14 символів, починаючи від 21-го символу
$section = file_get_contents('./people.txt', NULL, 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);
?>

Журнал змін

Версія Опис
5.1.0 Додано параметри offset та maxlen.

Примітки

Зауваження: Ця функція є бінарно безпечною.

Підказка

URL як назву файлу можна використовувати з цією функцією, якщо ввімкнені обгортки fopen. Докладніше про те, як вказати назву файлу: fopen(). На сторінці Підтримувані протоколи та обгортки є посилання на інформацію про можливості різних обгорток, примітки щодо їхнього використання, інформацію про будь-які попередньо визначені цими обгортками змінні.

Увага

Якщо використовувати SSL, Microsoft IIS порушуватиме протокол, закриваючи зʼєднання без надсилання індикатора close_notify. Коли буде досягнуто кінця даних, PHP повідомлятиме: "SSL: Fatal Protocol Error". Щоб обійти це, значення error_reporting має бути знижене до рівня, який не включає попереджень. PHP може виявити несправне програмне забезпечення сервера IIS та приховати попередження, якщо відкривати потік за допомогою обгортки https://. Якщо розробник використовує fsockopen() для створення сокета ssl://, то він сам має виявляти та приховувати це попередження.

Прогляньте також

add a note

User Contributed Notes 5 notes

up
39
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
5
KC
1 year 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
4
brentcontact at daha dot us
1 year 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
2 years 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
}
To Top