Методы чтения и сохранения содержимого файлов в PHP

Раздел: Программирование на PHP -> Работа с файловой системой

Основные подходы к получению и записи данных из файла

Как прочитать или записать всё содержимое файла одной строкой кода?

Самый лаконичный способ в PHP – использование функций file_get_contents() и file_put_contents(). Они берут на себя открытие, чтение (или запись) и закрытие файла.


// Чтение всего файла в строку
$content = file_get_contents('example.txt');
if ($content === false) {
    echo "Не удалось прочитать файл";
}

// Запись строки в файл (создаёт или перезаписывает)
$written = file_put_contents('output.txt', $content);
if ($written === false) {
    echo "Ошибка записи";
}
  

Php get extension (получение информации о файлах в php)

Типичные ошибки и их решение

  • Файл не существует – функция возвращает false. Всегда проверять результат через строгое сравнение (===).
  • Недостаточно прав на чтение или запись – file_get_contents() вернёт false, file_put_contents() – false или 0. Убедиться в правах доступа к файлу/каталогу.
  • Размер файла превышает лимит памяти (memory_limit) – для больших файлов использовать другие методы (например, fread по частям).
  • Бинарные данные – обе функции работают безопасно с бинарными данными, но при выводе в браузер необходимо устанавливать заголовки.

Цель: быстрое прототипирование, работа с конфигурационными или небольшими текстовыми файлами.

Как читать файл частями и не загружать его целиком в память?

Если файл большой (сотни мегабайт), используйте связку fopen() + fread() + fclose(). Можно читать по блокам, например, по 8 КБ.


$handle = fopen('bigfile.log', 'rb');
if ($handle) {
    while (($buffer = fread($handle, 8192)) !== false) {
        // Обработка блока $buffer
    }
    fclose($handle);
} else {
    echo "Не удалось открыть файл";
}
  

Index php file 1 (работа с файлами и папками на php)

Важно проверять, что дескриптор открыт ($handle !== false). При чтении до конца файла fread() возвращает пустую строку, но не false. Поэтому проверка !== false корректна. Не забыть вызвать fclose() после окончания работы.

Подходит для потоковой обработки, например, анализа логов, копирования файлов.

Как обработать файл построчно, например, для разбора CSV?

Функция fgets() читает одну строку до символа новой строки. Комбинируется с fopen().


$handle = fopen('data.csv', 'r');
while (($line = fgets($handle)) !== false) {
    $fields = str_getcsv($line, ',');
    // $fields – массив полей строки
}
fclose($handle);
  

Php запись в файл (запись в файл php)

Символы новой строки включаются в строку. Если нужно их удалить, используйте trim() или rtrim(). Файл с окончанием строки \r\n на Windows требует корректной обработки.

Идеально для логов, настроек, любых текстовых файлов с записями по строкам.

Как получить все строки файла в виде массива без лишнего кода?

Функция file() читает файл целиком и возвращает массив строк. Каждая строка включает символ конца строки (кроме последней, если файл не заканчивается переводом).


$lines = file('list.txt');
if ($lines === false) {
    echo "Ошибка чтения";
} else {
    foreach ($lines as $num => $line) {
        echo "Строка $num: " . rtrim($line);
    }
}
  

Php изменить файл (изменение файла в php)

file() загружает весь файл в память, поэтому не подходит для больших файлов. Вторым параметром можно передать флаги (FILE_IGNORE_NEW_LINES для удаления символа новой строки). Также можно использовать FILE_SKIP_EMPTY_LINES.

Удобно для небольших списков, конфигов, где нужен массив строк.

Как применить объектно-ориентированный стиль для работы с файлами?

Класс SplFileObject предоставляет итератор для построчного обхода файла, а также методы для позиционирования, записи и т.д.


$file = new SplFileObject('example.txt');
$file->setFlags(SplFileObject::DROP_NEW_LINE); // удалить перевод строки
foreach ($file as $lineNum => $line) {
    echo "Строка $lineNum: $line\n";
}
  

Php несколько файлов (несколько файлов в php)

При создании объекта может быть выброшено исключение RuntimeException, если файл не найден. Некоторые методы (например, fwrite) доступны только если объект открыт для записи.

Полезен в современных проектах с ООП-архитектурой, где требуется более гибкое управление.

Как добавить данные в конец существующего файла?

Функция file_put_contents() с флагом FILE_APPEND. Для исключения одновременной записи из нескольких процессов добавляют флаг LOCK_EX.


file_put_contents('log.txt', "Новая запись\n", FILE_APPEND | LOCK_EX);
  

найти файл php (поиск файла php)

На некоторых платформах (особенно Windows) блокировка работает не совсем надёжно. Для критичных к конкурентному доступу логов лучше использовать специализированные библиотеки или базы данных.

Подходит для логов, аудита, накопления данных.

Как загрузить содержимое удалённого файла по HTTP?

file_get_contents() умеет работать с URL при включённой директиве allow_url_fopen. Можно передать контекст для настройки таймаута, заголовков и т.д.


$context = stream_context_create([
    'http' => [
        'timeout' => 10,
        'header' => "User-Agent: MyScript\r\n"
    ]
]);
$data = file_get_contents('http://api.example.com/data.json', false, $context);
  

Если allow_url_fopen отключён по соображениям безопасности, используйте cURL. При ошибках соединения функция возвращает false, а флаг $http_response_header (переменная из глобальной области) может содержать HTTP-заголовки ответа.

Удобно для интеграции с внешними API, парсинга веб-страниц.

- Php размер файла (размер файла php)
- Php создание файла (создание файла в php)
- массив файлов php (массив файлов в php)

Расширенные примеры работы с содержимым файлов

Пример 1. Построчное чтение CSV и преобразование в ассоциативный массив

Пример

$handle = fopen('users.csv', 'r');
$headers = fgetcsv($handle); // заголовки столбцов
while (($row = fgetcsv($handle)) !== false) {
    $record = array_combine($headers, $row);
    print_r($record);
}
fclose($handle);
Array
(
    [name] => Иван
    [email] => ivan@example.com
)
Array
(
    [name] => Мария
    [email] => maria@example.com
)
...

Результат: каждая строка превращается в ассоциативный массив с ключами из первой строки. Функция fgetcsv() корректно обрабатывает кавычки и разделители.

Пример 2. Генератор для чтения большого файла без загрузки в память

Пример

function readFileLines(string $filename): Generator
{
    $handle = fopen($filename, 'r');
    if (!$handle) {
        throw new RuntimeException("Не удалось открыть файл $filename");
    }
    while (($line = fgets($handle)) !== false) {
        yield rtrim($line, "\r\n");
    }
    fclose($handle);
}

$lines = readFileLines('huge_log.log');
foreach ($lines as $lineNumber => $line) {
    // Обрабатываем одну строку
    if ($lineNumber > 10000) break; // только первые 10000 строк
}
(нет прямого вывода, но потребление памяти остаётся минимальным)

Генератор возвращает строки по одной, не накапливая их в массиве. Полезно для логов размером в гигабайты.

Пример 3. Атомарная запись через временный файл

Пример

$data = "Важные данные";
$file = 'config.php';
$tmp = tempnam(sys_get_temp_dir(), 'cfg');
if (file_put_contents($tmp, $data) !== false) {
    rename($tmp, $file);
} else {
    unlink($tmp);
    echo "Ошибка записи";
}
(файл config.php заменяется новой версией только после успешной записи)

Метод предотвращает частичную запись. Если скрипт прерывается во время записи, на диске остаётся временный файл, а целевой файл не повреждается. Важно, чтобы tempnam и итоговый файл находились в одной файловой системе (для работы rename).

Пример 4. Чтение бинарного файла (например, PNG) и извлечение заголовка

Пример

$handle = fopen('image.png', 'rb');
$header = fread($handle, 8); // первые 8 байт – сигнатура PNG
fclose($handle);
$hex = bin2hex($header);
echo "Сигнатура: $hex\n";
if ($header === "\x89PNG\r\n\x1a\n") {
    echo "Это PNG-файл";
}
Сигнатура: 89504e470d0a1a0a
Это PNG-файл

Режим "rb" обязателен для бинарных файлов, чтобы избежать преобразования концов строк. Функция bin2hex() переводит байты в hex-строку для отладки.

Пример 5. Удаление BOM (Byte Order Mark) из UTF-8 файла

Пример

$content = file_get_contents('file_with_bom.txt');
$bom = pack('H*','EFBBBF'); // UTF-8 BOM
$clean = preg_replace('/^' . preg_quote($bom, '/') . '/', '', $content);
file_put_contents('file_clean.txt', $clean);
(файл без невидимых символов в начале)

Проблема: если в начале файла стоит BOM (3 байта), некоторые парсеры могут работать некорректно. Приведённый код удаляет его с помощью регулярного выражения.

Пример 6. Блочное чтение с параллельной обработкой (использование chunk)

Пример

$chunkSize = 1024 * 16; // 16 KB
$handle = fopen('bigfile.bin', 'rb');
$position = 0;
while (!feof($handle)) {
    $chunk = fread($handle, $chunkSize);
    // Обработка фрагмента – например, подсчёт байтов
    $position += strlen($chunk);
}
fclose($handle);
echo "Обработано байт: $position";
Обработано байт: 12345678

Подходит для потоковой передачи данных (шифрование, контрольные суммы).

Пример 7. Запись содержимого с гарантированной блокировкой для многопоточных приложений

Пример

$data = "лог: действие выполнено\n";
$fp = fopen('shared.log', 'a');
if (flock($fp, LOCK_EX)) {
    fwrite($fp, $data);
    fflush($fp);
    flock($fp, LOCK_UN);
}
fclose($fp);
(запись без конфликтов между параллельными процессами)

Использование flock с монопольной блокировкой гарантирует, что два скрипта не запишут данные одновременно. Важно вызывать fflush перед снятием блокировки.

Содержимое файла PHP - comments

En
Php содержимое файла (php)