Работа с файлами в PHP

Работа с файлами в PHP: чтение file_get_contents, запись file_put_contents, работа через fopen/fclose, проверка существования и удаление файлов.

Файловая система — один из главных инструментов PHP-разработчика. Конфиги, логи, загружаемые изображения, кэш — всё это файлы. PHP предоставляет богатый набор функций для их создания, чтения и изменения.

Быстрое чтение и запись

Функции file_get_contents() и file_put_contents() — самый простой способ работать с файлами:

<?php
// Запись
$data = "Лог: пользователь авторизован\n";
file_put_contents("/tmp/app.log", $data);

// Дозапись (флаг FILE_APPEND)
file_put_contents("/tmp/app.log", "Лог: страница загружена\n", FILE_APPEND);

// Чтение
$content = file_get_contents("/tmp/app.log");
echo $content;

Вывод:

Лог: пользователь авторизован
Лог: страница загружена

Построчное чтение

Если файл большой, лучше читать его построчно через file() (возвращает массив строк) или через дескриптор:

<?php
// file() читает файл в массив строк
file_put_contents("/tmp/names.txt", "Анна\nБорис\nВера\n");

$lines = file("/tmp/names.txt", FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES);
foreach ($lines as $i => $line) {
    echo ($i + 1) . ". $line\n";
}

Вывод:

1. Анна
2. Борис
3. Вера

fopen / fread / fwrite / fclose

Для более тонкого контроля используют дескриптор файла. Режимы открытия: r — чтение, w — запись (стирает), a — дозапись, x — создать (ошибка если есть):

<?php
// Запись через дескриптор
$fh = fopen("/tmp/data.txt", "w");
fwrite($fh, "Первая строка\n");
fwrite($fh, "Вторая строка\n");
fclose($fh);

// Чтение через дескриптор
$fh = fopen("/tmp/data.txt", "r");
while (!feof($fh)) {
    $line = fgets($fh); // читаем по одной строке
    if ($line !== false) echo trim($line) . " [OK]\n";
}
fclose($fh);

Вывод:

Первая строка [OK]
Вторая строка [OK]

Всегда закрывайте дескриптор через fclose() — иначе файл остаётся заблокированным, а ресурсы — занятыми.

Проверки и манипуляции с файлами

<?php
$path = "/tmp/test.txt";

file_put_contents($path, "test");

var_dump(file_exists($path));  // bool(true)
var_dump(is_file($path));      // bool(true)
var_dump(is_dir("/tmp"));      // bool(true)

echo filesize($path) . " байт\n"; // 4 байт

// Переименование и удаление
rename($path, "/tmp/renamed.txt");
unlink("/tmp/renamed.txt");

var_dump(file_exists("/tmp/renamed.txt")); // bool(false)

Вывод:

bool(true)
bool(true)
bool(true)
4 байт
bool(false)

Работа с директориями

<?php
mkdir("/tmp/mydir", 0755);            // создать папку
$files = scandir("/tmp/mydir");        // список файлов
print_r($files);

file_put_contents("/tmp/mydir/a.txt", "a");
file_put_contents("/tmp/mydir/b.txt", "b");
print_r(glob("/tmp/mydir/*.txt")); // поиск по маске

Вывод:

Array ( [0] => . [1] => .. )
Array ( [0] => /tmp/mydir/a.txt [1] => /tmp/mydir/b.txt )

Коротко

  • file_put_contents() / file_get_contents() — быстрая запись и чтение; FILE_APPEND для дозаписи.
  • file() — читает файл в массив строк; удобно с флагами FILE_IGNORE_NEW_LINES.
  • fopen/fwrite/fread/fclose — для тонкого контроля и больших файлов.
  • file_exists(), is_file(), is_dir(), filesize() — проверки.
  • rename(), unlink(), mkdir(), scandir(), glob() — манипуляции с файлами и папками.
Проверьте себя
1. Как дописать текст в конец файла без стирания его содержимого?
Afile_put_contents($path, $text)
Bfile_put_contents($path, $text, FILE_APPEND)
Cfile_write($path, $text, "append")
Dfopen($path, "w")
2. Что вернёт file("names.txt", FILE_IGNORE_NEW_LINES)?
AСодержимое файла как одну строку
BМассив строк файла без символов новой строки
CКоличество строк в файле
DДескриптор файла
3. Почему важно вызывать fclose() после работы с дескриптором файла?
Afclose() записывает данные на диск — без него запись не произойдёт
BБез fclose() файл остаётся заблокированным и занимает системные ресурсы
Cfclose() создаёт резервную копию файла
DБез fclose() PHP выбросит исключение при следующем открытии
Поддержать проект