Почему работа с файлами в 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($_