Одной из этих важных функций PHP является чтение содержимого файла в виде строки, что может быть достигнуто с помощью функции file_get_contents()
. Давайте разберемся, как пользоваться этой важной функции PHP.
В этой статье мы рассмотрим такие вопросы:
- Синтаксис функции file_get_contents()
- Чтение локального файла
- Чтение файла на сервере
- Загрузка файлов с помощью функции file_get_contents()
- Параметры контекста
Синтаксис функции file_get_contents()
Функция file_get_contents()
— встроенная функция PHP, используемая для чтения данных из файла, URL-а или потока HTTP или FTP. При вызове функция считывает весь файл в строку. Для этой функции не требуется явных операций открытия или закрытия файла, которые обычно нужны другим традиционным методам обработки файлов в PHP.
Из документации мы знаем, что эта функция может принимать такие параметры:
1 2 3 4 5 6 7 | file_get_contents( string $filename, bool $use_include_path = false, ?resource $context = null, int $offset = 0, ?int $length = null ) |
где:
$path
- указывает файл для чтения.$include_path
(необязательно) - указывает, должна ли функция искать файл в include_path (по умолчаниюfalse
).$context
(необязательно) - указывает контекст дескриптора файла. Контекст — это набор параметров, которые могут изменять поведение потока. Чтобы пропустить параметр, в него передают значениеnull
, когда особый контекст не нужен.$offset
(необязательно) - указывает, с какой части файла начать чтение. Отрицательное значение смещения будет отсчитываться с конца потока. Поиск смещения (offset
) не поддерживается при работе с удалёнными файлами. Попытка поиска смещения на нелокальных файлах может работать при небольших смещениях, но результат будет непредсказуемым, так как функция работает на буферизованном потоке.$length
(необязательно) - указывает максимальную длину считываемых данных. По умолчанию чтение осуществляется пока не будет достигнут конец файла.
Возвращает функция либо строку, либо false
. Этим функция file_get_contents() похожа на функцию file(), за исключением того, что функция file_get_contents() еще может возвращать содержимое файла в строке длиной $length
байтов со смещения $offset
. В случае неудачи функция file_get_contents() вернёт false
.
Вызов функции file_get_contents() наиболее предпочтителен, когда требуется получить содержимое файла целиком, поскольку для улучшения производительности функция использует технику отображения файла в памяти (memory mapping), если операционная система её поддерживает.
Чтение локального файла
Предположим, у вас есть текстовый файл с именем example.txt . Вы можете прочитать этот файл и распечатать его содержимое, используя следующий код:
1 2 3 4 | <?php $file_content = file_get_contents('example.txt'); echo $file_content; ?> |
В этом примере функция file_get_contents()
считывает содержимое example.txt и сохраняет его как строку в переменной $file_content. Затем оператор echo
печатает эту строку.
Например, для файла, содержащего стихотворение Т.Г. Шевченко, весь контент будет выведен в одну строку:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | Тарас Шевченко Садок вишневий коло хати Садок вишневий коло хати, Хрущі над вишнями гудуть, Плугатарі з плугами йдуть, Співають ідучи дівчата, А матері вечерять ждуть. Сім’я вечеря коло хати, Вечірня зіронька встає. Дочка вечерять подає, А мати хоче научати, Так соловейко не дає. Поклала мати коло хати Маленьких діточок своїх; Сама заснула коло їх. Затихло все, тілько дівчата Та соловейко не затих. |
Вывод содержимого файла с помощью функции file_get_contents()
:
1 | Тарас Шевченко Садок вишневий коло хати Садок вишневий коло хати, Хрущі над вишнями гудуть, Плугатарі з плугами йдуть, Співають ідучи дівчата, А матері вечерять ждуть. Сім’я вечеря коло хати, Вечірня зіронька встає. Дочка вечерять подає, А мати хоче научати, Так соловейко не дає. Поклала мати коло хати Маленьких діточок своїх; Сама заснула коло їх. Затихло все, тілько дівчата Та соловейко не затих. |
Если нам нужна часть файла, то нужно указать параметры $offset
(125) и $length
(46) в виде количества символов:
1 2 3 4 | <?php $file_content = file_get_contents('example.txt', false, null, 125, 46); echo $file_content; ?> |
В результате получим только одну строку из стихотворения: "Хрущі над вишнями гудуть".
В этом случае четвертый параметр $offset
определяет смещение. Он также может быть в виде отрицательного значения. Тогда смещение считается от конца строки.
1 2 3 4 | $file_content = file_get_contents('example.txt', false, null, 654); echo $file_content;//"Затихло все, тілько дівчата Та соловейко не затих." $file_content = file_get_contents('example.txt', false, null, -40); echo $file_content; //"Та соловейко не затих." |
Пятым параметром вы указываете длину $length
возвращаемой строки. Например, так мы можем получит начало файла:
1 2 | $file_content = file_get_contents('example.txt', false, null, 0, 27); echo $file_content; //"Тарас Шевченко" |
Обработка ошибок
Поскольку файл, содержимое которого вы пытаетесь получить с помощью функции file_get_contents()
, может быть перемещен или удален с сервера, либо он вообще там никогда не существовал под тем именем, которое вы указали, необходимо проверить наличие этого файла по указанному пути, а затем уже считывать его. Это можно сделать и с помощью самой функции file_get_contents()
, т.к. она возвращает false
в случае ошибки.
Кроме того, вы можете использовать функцию file_exists()
, чтобы проверить, существует ли файл, прежде чем пытаться его прочитать:
1 2 3 4 5 6 7 8 9 10 | <?php $filename = 'example.txt'; if (file_exists($filename)) { $file_content = file_get_contents($filename); echo $file_content; } else { echo "Файл $filename не найден"; } ?> |
Чтение файла на сервере
Функция file_get_contents()
также может считывать содержимое из URL. Вот пример того, как использовать ее для получения HTML-кода веб-страницы:
1 2 3 4 | <?php $website_content = file_get_contents('https://www.site.com'); echo $website_content; ?> |
Тут также мы увидим вывод содержимого файла в виде строки.
urlencode()
Получение IP-адреса
Интересно, что иногда вы можете использовать функцию file_get_contents()
даже для тех целей, о которых, возможно, не подозревали.
В следующем примере запрос отправляется на api.ipify.org, который должен вернуть внешний IP-адрес компьютера, на котором выполняется сценарий.
1 2 3 | <?php echo file_get_contents("https://api.ipify.org/"); ?> |
Попробуйте сами.
Чтение файла в json-формате
Самым популярным вариантом чтения данных является использование файла в json-формате. Для примера мы загрузим список дел с популярного сервиса JSONPlaceholder.
1 2 3 4 5 6 7 8 9 10 11 12 | <?php $jsonData = file_get_contents ( 'https://jsonplaceholder.typicode.com/todos' ) ; $data = json_decode ( $jsonData, true ) ; //print_r ( $data ) ; echo '<ul>'; foreach($data as $obj){ //print_r($obj); echo '<li class="'.($obj["completed"]? "ok": "no").'">'.$obj["title"].'</li>'; } echo '</ul>'; ?> |
В примере мы видим использование функции print_r()
, которая выведен на экран содержимое json-файла в виде массива, либо содержимое каждого вложенного массива, в который превратились данные загружаемого json-файла.
Для того чтобы вывод информации был оформлен красиво, вы можете использовать такие css-стили:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | body { background-color: #333; color: #333; font-family: 'Raleway', sans-serif; font-weight:400; width: 80%; margin: 20px auto; background-color: #fff; padding: 10px 25px; line-height: 1.5; } ul { margin: 0; padding: 0; list-style: none; vertical-align: baseline; } li {list-style-type: none;} .ok::before{ content: '\2714'; color: #19b819; margin-right: 10px; } .no::before{ content: '\2716'; color: #f00; margin-right: 10px; } |
В случае, если мы попытаемся указать, с какого символа мы хотим начать считывание файла и ограничение по количеству символов, как в случае с получением контента из локального файла в виде
1 2 3 4 5 | <?php $jsonData = file_get_contents ( 'https://jsonplaceholder.typicode.com/todos', false, null, 125, 500); $data = json_decode ( $jsonData, true ) ; print_r ( $data ) ; ?> |
мы увидим такую ошибку:
Warning: file_get_contents(): Stream does not support seeking in index.php on line 2.
В случае с получением информации в ограниченном количестве с сервера JSONPlaceholder мы можем изменить ссылку-запрос на загрузку файла со списком деле только одного пользователя - https://jsonplaceholder.typicode.com/todos/?userId=1
.
В случае работы с вашей базой данных вы должны самостоятельно задать запрос, ограничивающий выборку данных и формирование на его основе JSON-файла.
Загрузка файлов с помощью функции file_get_contents()
Еще одна особенность функции file_get_contents() - это то, что ее можно использовать для загрузки файлов из удаленных источников. Это особенно полезно, когда вы хотите сохранить файлы на своем сервере или манипулировать ими перед сохранением, например, сделать из загруженного изображения размытую картинку.
Допустим, мы хотим загрузить фото с популярного ресурса unsplash.com.
1 2 3 4 5 6 7 | <?php $fileUrl = 'https://images.unsplash.com/photo-1732054085389-2a2bae661d5e?crop=faces&fit=crop&w=550&h=650'; $fileContents = file_get_contents($fileUrl); $localFilePath = 'images/image_file.png'; file_put_contents($localFilePath, $fileContents); echo '<img src="'.$localFilePath.'">'; ?> |
Важно, чтобы папка images уже была на вашем сервере, иначе вы получите ошибку вида:
Warning: file_put_contents(images/image_file.png): Failed to open stream: No such file or directory in index.php on line 4.
Параметры контекста
Третий параметр file_get_contents()
позволяет вам указать контекст для запроса. Этот контекст может содержать различные параметры, такие как заголовки, данные аутентификации и многое другое. Например, вы можете установить тайм-аут для запроса с помощью параметра timeout
:
1 2 3 4 5 6 7 8 9 10 11 | <?php $url = 'https://www.example.com'; $context = stream_context_create([ 'http' => [ 'timeout' => 10, ], ]); $pageContent = file_get_contents($url, false, $context); echo $pageContent; ?> |
Для получения контекста вам понадобится функция stream_context_create()
.
Если вы используете третий параметр $context
, вы также можете указать дополнительные параметры в виде имени пользователя и пароля, например, а также сформировать нужные вам заголовки.
В следующем примере выполняется запрос POST к quotes.toscrape.com/login
и возвращается результат. В этом запросе передаются пользовательские данные, чтобы сохранить представление для вошедших в систему пользователей.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?php $userdata = ['username' => 'asdf', 'password' => 'wasd']; $userdata = http_build_query($userdata); $options = [ 'http' => [ 'method' => 'POST', 'header'=> "Content-type: application/x-www-form-urlencoded\r\n" . "Content-Length: " . strlen($userdata) . "\r\n", 'content' => $userdata ] ]; $context = stream_context_create($options); echo file_get_contents('http://quotes.toscrape.com/login', false, $context); ?> |
Еще один пример также связан с JSONPlaceholder. Здесь мы меняем данные для первого поста с помощью метода PUT:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php $body = array( 'title'=> 'User 1 new post', 'body'=>'I have many good news for you!'); $body = json_encode($body); $options = [ 'http' => [ 'method' => 'PUT', 'header'=> "Content-type: application/json\r\n" . "Content-Length: " . strlen($body) . "\r\n", 'content' => $body ] ]; $context = stream_context_create($options); echo file_get_contents('https://jsonplaceholder.typicode.com/posts/1', false, $context); ?> |
В результате увидим строку:
1 | { "title": "User 1 new post", "body": "I have many good news for you!", "id": 1 } |
Заключение
Функция file_get_contents()
в PHP обеспечивает простой и эффективный способ чтения содержимого файла в строку. Ее возможности распространяются на чтение локальных файлов и содержимого по указанному URL, что делает ее универсальной функцией в наборе инструментов обработки файлов PHP.