file_get_contents
(PHP 4 >= 4.3.0, PHP 5)
file_get_contents — Читает содержимое файла в строку
Описание
$filename
[, bool $use_include_path
= false
[, resource $context
[, int $offset
= -1
[, int $maxlen
]]]] )
Данная функция похожа на функцию file() с той только
разницей, что file_get_contents() возвращает
содержимое файла в строке, начиная с указанного смещения
offset
и до maxlen
байт. В случае неудачи, file_get_contents() вернёт FALSE
.
Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком, поскольку для улучшения производительности функция использует технику отображения файла в память (memory mapping), если она поддерживается вашей операционной системой.
Замечание:
Если вы открываете URI содержащий спецсимволы, такие как пробел, вам нужно закодировать URI при помощи urlencode().
Список параметров
-
filename
-
Имя читаемого файла.
-
use_include_path
-
Замечание:
Начиная с версии PHP 5 можно использовать константу
FILE_USE_INCLUDE_PATH
для поиска файла в include path. -
context
-
Корректный ресурс контекста, созданный с помощью функции stream_context_create(). Если в использовании особого контекста нет необходимости, можно пропустить этот параметр передав в него значение
NULL
. -
offset
-
Смещение, с которого начнется чтение оригинального потока.
Поиск смещения (
offset
) не поддерживается при работе с удаленными файлами. Попытка поиска смещения на нелокальных файлах может работать при небольших смещениях, но этот результат является непредсказуемым, так как он работает на буферизованном потоке. -
maxlen
-
Максимальный размер читаемых данных. По умолчанию чтение осуществляется пока не будет достигнут конец файла. Учтите, что этот параметр применяется и к потоку с фильтрами.
Возвращаемые значения
Функция возвращает прочтенные данные или FALSE
в случае возникновения ошибки.
Ошибки
Будет сгенерирована ошибка уровня E_WARNING
, если
параметр 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 .
|
5.0.0 | Добавлена поддержка контекста. |
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen(). Смотрите также список поддерживаемых оберток URL, их возможности, замечания по использованию и список предопределенных констант в Поддерживаемые протоколы и обработчики (wrappers).
При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify. PHP сообщит об этом как "SSL: Fatal Protocol Error" в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP версий 4.3.7 и старше умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обертки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.
Смотрите также
- file() - Читает содержимое файла и помещает его в массив
- fgets() - Читает строку из файла
- fread() - Бинарно-безопасное чтение файла
- readfile() - Выводит файл
- file_put_contents() - Пишет строку в файл
- stream_get_contents() - Читает оставшуюся часть потока в строку
- stream_context_create() - Создаёт контекст потока
- $http_response_header
- PHP Руководство
- Функции по категориям
- Индекс функций
- Справочник функций
- Расширения для работы с файловой системой
- Функции для работы с файловой системой
- basename
- chgrp
- chmod
- chown
- clearstatcache
- copy
- delete
- dirname
- disk_free_space
- disk_total_space
- diskfreespace
- fclose
- feof
- fflush
- fgetc
- fgetcsv
- fgets
- fgetss
- file_exists
- file_get_contents
- file_put_contents
- file
- fileatime
- filectime
- filegroup
- fileinode
- filemtime
- fileowner
- fileperms
- filesize
- filetype
- flock
- fnmatch
- fopen
- fpassthru
- fputcsv
- fputs
- fread
- fscanf
- fseek
- fstat
- ftell
- ftruncate
- fwrite
- glob
- is_dir
- is_executable
- is_file
- is_link
- is_readable
- is_uploaded_file
- is_writable
- is_writeable
- lchgrp
- lchown
- link
- linkinfo
- lstat
- mkdir
- move_uploaded_file
- parse_ini_file
- parse_ini_string
- pathinfo
- pclose
- popen
- readfile
- readlink
- realpath_cache_get
- realpath_cache_size
- realpath
- rename
- rewind
- rmdir
- set_file_buffer
- stat
- symlink
- tempnam
- tmpfile
- touch
- umask
- unlink
Коментарии
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);
?>
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
}
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.
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.
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.
}
}