Работа с файлами в 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 выбросит исключение при следующем открытии