Работа с файлами в PHP: от новичка до профи за 20 минут

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему работа с файлами в PHP — это маст-хев для любого разработчика

Представьте: вы пишете интернет-магазин. Клиент загружает аватарку, администратор выгружает CSV с товарами, а система логирует каждое действие. Без умения работать с файловой системой в PHP эти задачи превратятся в головную боль. Но если освоить базовые приёмы — вы сможете управлять данными на сервере так же легко, как редактируете заметки в телефоне.

В этой статье мы разберём работу с файлами в PHP от простого к сложному. Вы узнаете, как читать и записывать данные, проверять права доступа, загружать файлы на сервер и избегать типичных ошибок. Поехали!

Основы работы с файловой системой PHP

Прежде чем погружаться в код, давайте разберёмся с главными функциями, которые даёт нам PHP. Их можно разделить на три группы:

  • Проверка и метаданные — существует ли файл, какой у него размер, тип и права доступа.
  • Чтение и запись — открыть файл, прочитать строку, записать данные, закрыть.
  • Управление файловой структурой — создание, переименование, удаление файлов и папок.

Большинство операций в PHP для работы с файлами требуют всего одной-двух строк кода. Но важно понимать контекст: где находится файл относительно вашего скрипта, какие права у веб-сервера, и как обрабатывать ошибки.

Проверка существования и прав доступа

Первое, что нужно сделать перед любой операцией — убедиться, что файл существует. Для этого используем file_exists():

<?php
$filename = 'config.php';

if (file_exists($filename)) {
    echo "Файл $filename найден!";
} else {
    echo "Файл не существует";
}
?>

Но одного существования мало. Нужно проверить, можно ли его читать или писать. Для этого есть is_readable() и is_writable():

<?php
$file = 'data.txt';

if (is_readable($file)) {
    echo "Можно читать";
}
if (is_writable($file)) {
    echo "Можно писать";
}
?>

Это особенно важно при работе с файлами в PHP на продакшене — права доступа (chmod) часто становятся причиной ошибок «Permission denied».

Чтение файлов в PHP: три способа на любой вкус

Чтение — самая частая операция. PHP предлагает несколько подходов, каждый из которых хорош в своей ситуации.

Способ 1: file_get_contents — для маленьких файлов

Если вам нужно прочитать весь файл целиком в строку — это лучший вариант. Просто, быстро, без лишних движений:

<?php
$content = file_get_contents('readme.txt');
echo $content;
?>

Отлично подходит для конфигов, шаблонов, небольших логов. Но если файл весит 200 МБ — лучше не надо, память сервера скажет спасибо.

Способ 2: fopen + fgets — для больших файлов

Когда нужно обработать огромный CSV-файл или лог-файл на гигабайт, используйте построчное чтение. Это не загружает весь файл в память:

<?php
$handle = fopen('bigfile.log', 'r');
if ($handle) {
    while (($line = fgets($handle)) !== false) {
        // Обрабатываем каждую строку по отдельности
        echo $line . "<br>";
    }
    fclose($handle);
} else {
    echo "Ошибка открытия файла";
}
?>

Обратите внимание: мы обязательно закрываем файл с помощью fclose(). Это освобождает системные ресурсы.

Способ 3: file() — читаем в массив строк

Если каждая строка — это отдельная запись (например, список email-адресов), можно сразу получить массив:

<?php
$lines = file('users.txt');
foreach ($lines as $line_num => $line) {
    echo "Строка #{$line_num}: " . htmlspecialchars($line) . "<br>";
}
?>

Этот метод удобен, но, как и file_get_contents, загружает весь файл в память.

Запись данных в файл на PHP

Запись — вторая по важности операция. Тут тоже есть два основных подхода.

file_put_contents — быстрая запись

Если нужно записать строку или результат работы скрипта — это самый простой путь:

<?php
$data = "Сегодня: " . date('Y-m-d H:i:s') . "\n";
file_put_contents('log.txt', $data, FILE_APPEND);
?>

Флаг FILE_APPEND добавляет данные в конец файла (не перезаписывая его). Если его убрать — файл будет перезаписан каждый раз.

fwrite — гибкий контроль

Для более тонкой работы (например, нужно записать несколько разных данных) используйте fopen в режиме записи и fwrite:

<?php
$file = 'report.txt';
$handle = fopen($file, 'w'); // 'w' — перезапись, 'a' — добавление

if ($handle) {
    fwrite($handle, "Отчет за " . date('d.m.Y') . "\n");
    fwrite($handle, "----------------------\n");
    fwrite($handle, "Посетителей: 154\n");
    fwrite($handle, "Заказов: 12\n");
    fclose($handle);
    echo "Отчет сохранен!";
} else {
    echo "Не удалось открыть файл для записи";
}
?>

Режимы открытия файлов в PHP — тема отдельного разговора. Запомните основные:

  • 'r' — только чтение
  • 'w' — запись (перезапись, создаёт файл если нет)
  • 'a' — запись в конец (добавление)
  • 'x' — создание и запись (ошибка если файл уже есть)

Загрузка файлов на сервер через PHP

Это, пожалуй, самая востребованная задача в веб-разработке. Пользователь выбирает файл на форме, и ваш PHP-скрипт должен его принять, проверить и сохранить.

HTML форма

<form action="upload.php" method="POST" enctype="multipart/form-data">
    <input type="file" name="userfile">
    <input type="submit" value="Загрузить">
</form>

Важно: атрибут enctype="multipart/form-data" обязателен для загрузки файлов.

PHP обработчик

<?php
$uploadDir = 'uploads/';
$filename = basename($_                

Блоги

Рекомендаций по книгам