Практическое руководство по записи файлов в PHP

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

Способы записи данных в файл на PHP

Как эффективно записать данные в файл с помощью одной функции?

Наиболее простой и безопасный способ - использовать встроенную функцию file_put_contents(). Она выполняет запись за один вызов, автоматически открывает файл, записывает данные и закрывает его. Если файл не существует, он будет создан. По умолчанию запись производится с затиранием предыдущего содержимого.

$data = "Привет, мир!";
$result = file_put_contents('example.txt', $data);
if ($result !== false) {
    echo "Записано $result байт.";
} else {
    echo "Ошибка записи.";
}

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

Второй аргумент может быть строкой, массивом (будет объединён через перевод строки) или ресурсом потока. Третий аргумент - флаги: FILE_APPEND для добавления в конец, LOCK_EX для эксклюзивной блокировки.

Типичные проблемы:

  • Отсутствие прав на запись - возникает Warning: file_put_contents(example.txt): failed to open stream: Permission denied. Решение - проверить права на директорию или файл.
  • Несуществующая директория - Warning: file_put_contents(path/to/file.txt): failed to open stream: No such file or directory. Необходимо предварительно создать директорию функцией mkdir().
  • Файл заблокирован другим процессом - если используется LOCK_EX, функция дождётся освобождения блокировки, но может привести к задержкам. В крайних случаях стоит использовать дополнительную обработку.

Как записать данные с помощью fopen и fwrite?

Когда требуется более тонкое управление - выбор режима открытия, побайтовая запись, работа с большими объёмами - используется пара fopen() + fwrite().

$file = fopen('example.txt', 'w'); // 'w' - перезапись, 'a' - добавление
if ($file) {
    fwrite($file, "Первая строка\n");
    fwrite($file, "Вторая строка");
    fclose($file);
    echo "Данные записаны.";
} else {
    echo "Не удалось открыть файл.";
}

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

Режим 'w' открывает файл для записи и помещает указатель в начало, 'a' - для добавления в конец. Существуют также 'r+' (чтение+запись с начала) и 'c' (запись без затирания, но с перемещением указателя).

Распространённые ошибки:

  • Забытый fclose() - ресурс остаётся занятым, что может препятствовать другим операциям.
  • Попытка записать в файл, открытый в режиме 'r' - приведёт к ошибке.
  • Игнорирование возвращаемого значения fwrite() - функция может записать меньше байт, чем передано; нужно проверять количество.

Как добавить данные в конец файла?

Самый простой способ - использовать флаг FILE_APPEND с file_put_contents() или режим 'a' в fopen().

file_put_contents('log.txt', "Новая запись\n", FILE_APPEND);
// или
$fh = fopen('log.txt', 'a');
fwrite($fh, "Новая запись\n");
fclose($fh);

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

Оба варианта создадут файл, если его нет.

Как записать массив CSV-строкой?

PHP предоставляет функцию fputcsv(), которая форматирует массив как строку CSV и записывает в файл.

$data = ['Имя', 'Возраст', 'Город'];
$file = fopen('users.csv', 'w');
fputcsv($file, $data, ';', '"'); // разделитель ;, ограничитель "
fclose($file);

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

Для массовой записи следует перебирать строки и вызывать fputcsv() для каждой.

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

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

Для предотвращения конфликтов при параллельных запросах используется блокировка: flock() или флаг LOCK_EX.

$fh = fopen('counter.txt', 'c');
if (flock($fh, LOCK_EX)) {
    ftruncate($fh, 0);        // очистить файл
    fwrite($fh, 'новое значение');
    fflush($fh);
    flock($fh, LOCK_UN);      // снять блокировку
}
fclose($fh);

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

Флаг LOCK_EX в file_put_contents() делает то же самое внутри.

Ошибка: взаимная блокировка - если два процесса держат блокировку на разные файлы и ждут друг друга. Решение - избегать вложенных блокировок.

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

Стандартными средствами нельзя вставить данные в начало без перезаписи. Приходится читать файл, добавлять новые данные в начало и перезаписывать.

$oldContent = file_get_contents('file.txt');
file_put_contents('file.txt', "Новый заголовок\n" . $oldContent);

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

Для больших файлов такой подход расточителен; лучше использовать временный файл или переписать структуру данных.

Как обработать ошибки при записи в файл?

Проверка возвращаемых значений и перехват исключений - надёжная практика.

try {
    $result = file_put_contents('protected.txt', 'data', LOCK_EX);
    if ($result === false) {
        throw new RuntimeException('Не удалось записать файл');
    }
} catch (RuntimeException $e) {
    error_log($e->getMessage());
}

Также можно использовать пользовательский обработчик ошибок для преобразования Warning в исключения.

Типичная ошибка: не проверяется возвращаемое значение fwrite() - частичная запись остаётся незамеченной. Решение - сравнивать возвращённое количество байт с ожидаемым.

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

Расширенные примеры записи в файл

Запись больших объёмов данных с буферизацией

При записи очень больших строк или потоков удобно использовать fwrite() в цикле, чтобы не держать весь объём в памяти.

Пример
$source = fopen('bigfile.txt', 'r'); // источник данных
$dest = fopen('copy.txt', 'w');
if ($source && $dest) {
    while (!feof($source)) {
        $chunk = fread($source, 8192); // читаем по 8 КБ
        if ($chunk !== false) {
            fwrite($dest, $chunk);
        }
    }
    fclose($source);
    fclose($dest);
    echo 'Копирование завершено.';
} else {
    echo 'Ошибка открытия файлов.';
}

Результат: создаётся точная копия без перегрузки памяти.

Запись ассоциативного массива в формате JSON с отступами

Пример
$data = [
    'name' => 'Анна',
    'age' => 28,
    'skills' => ['PHP', 'JavaScript']
];
file_put_contents('user.json', json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

Результат:

{
    "name": "Анна",
    "age": 28,
    "skills": [
        "PHP",
        "JavaScript"
    ]
}

Запись в файл через FTP (удалённый сервер)

Пример
$ftp = ftp_connect('ftp.example.com');
ftp_login($ftp, 'user', 'password');
ftp_pasv($ftp, true);
$tmpFile = tmpfile();
fwrite($tmpFile, 'содержимое для удалённого файла');
rewind($tmpFile);
ftp_fput($ftp, 'remote.txt', $tmpFile, FTP_ASCII);
fclose($tmpFile);
ftp_close($ftp);

Результат: файл remote.txt появится на FTP-сервере.

Запись в файл с условным форматированием (использование sprintf)

Пример
$name = 'Иван';
$score = 95.5;
$line = sprintf("%-20s %6.1f\n", $name, $score);
file_put_contents('scores.txt', $line, FILE_APPEND);

Файл scores.txt:

Иван                         95.5

Запись в файл с использованием потоков (stream wrappers)

Пример
$context = stream_context_create([
    'http' => [
        'method' => 'GET',
        'header' => "User-Agent: Mozilla/5.0"
    ]
]);
$remoteData = file_get_contents('https://example.com/data', false, $context);
file_put_contents('local.html', $remoteData);

Результат: содержимое удалённой страницы сохраняется локально.

Запись с проверкой кодировки (iconv)

Пример
$textUtf8 = 'Привет мир';
$textWin = iconv('UTF-8', 'Windows-1251//IGNORE', $textUtf8);
file_put_contents('win1251.txt', $textWin);

Файл будет сохранён в кодировке Windows-1251, некорректные символы проигнорированы.

Запись в несколько файлов одновременно (массив путей)

Пример
$paths = ['backup1.txt', 'backup2.txt'];
$data = 'важные данные';
foreach ($paths as $path) {
    file_put_contents($path, $data, LOCK_EX);
}

Создаются два одинаковых файла с содержимым.

Запись в файл с временной меткой

Пример
$logEntry = '[' . date('Y-m-d H:i:s') . '] ' . 'Событие произошло' . PHP_EOL;
file_put_contents('events.log', $logEntry, FILE_APPEND | LOCK_EX);

Каждый вызов добавляет строку с датой.

Запись в файл PHP - comments

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