File put contents: примеры (PHP)

Функция file_put_contents: полное руководство с примерами на PHP
Раздел: Работа с файлами
file_put_contents(string $filename, mixed $data, int $flags = 0, ?resource $context = null): int|false
Описание функции file_put_contents

Функция file_put_contents записывает строку в файл. Это более простой альтернативный вариант последовательным вызовам функций fopen, fwrite и fclose.

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

Аргументы функции
  • filename (строка) - Путь к файлу, в который производится запись.
  • data (mixed) - Записываемые данные. Могут быть строкой, массивом или потоковым ресурсом. Если передается массив, его элементы будут записаны в том же порядке.
  • flags (int) - Битовая маска флагов:
    • FILE_USE_INCLUDE_PATH - искать файл в include_path.
    • FILE_APPEND - добавить данные в конец файла, а не перезаписывать его.
    • LOCK_EX - получить эксклюзивную блокировку на файл на время записи.
  • context (resource) - Корректный контекст потока, созданный с помощью stream_context_create().

Функция возвращает количество записанных байт или false в случае ошибки.

Короткие примеры использования
Простая запись строки
<?php
$file = 'test.txt';
$data = "Первая строка\n";
$result = file_put_contents($file, $data);
echo "Записано байт: $result"; // Записано байт: 26 (зависит от кодировки)
?>
Содержимое файла test.txt: 
Первая строка
Запись с флагом FILE_APPEND
<?php
$file = 'log.txt';
$entry = date('Y-m-d H:i:s') . " - событие\n";
file_put_contents($file, $entry, FILE_APPEND);
?>
Содержимое файла log.txt после нескольких вызовов:
2023-10-26 10:15:00 - событие
2023-10-26 10:16:12 - событие
2023-10-26 10:17:05 - событие
Запись с блокировкой (LOCK_EX)
<?php
$file = 'counter.txt';
// Прочитать текущее значение, увеличить и записать безопасно
$current = (int)@file_get_contents($file);
$current++;
file_put_contents($file, $current, LOCK_EX);
?>
Содержимое counter.txt обновлено атомарно, даже при одновременных запросах.
Запись массива
<?php
$file = 'lines.txt';
$lines = ["Строка 1", "Строка 2", "Строка 3"];
$bytes = file_put_contents($file, $lines);
echo "Записано: $bytes байт";
?>
Содержимое lines.txt:
Строка 1Строка 2Строка 3
Похожие функции в PHP
fopen(), fwrite(), fclose()

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

<?php
$handle = fopen('file.txt', 'w');
fwrite($handle, 'Часть данных');
fwrite($handle, 'Еще данные');
fclose($handle);
?>
SplFileObject

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

<?php
$file = new SplFileObject('data.txt', 'w');
$file->fwrite('Запись через SplFileObject');
?>
Альтернативы в других языках

File put contents в Python

Используется функция open() с режимом 'w' (перезапись) или 'a' (добавление). В отличие от PHP, в Python принято использовать менеджер контекста with.

# Запись
with open('test.txt', 'w', encoding='utf-8') as f:
    f.write('Текст для записи')

# Добавление в конец
with open('log.txt', 'a', encoding='utf-8') as f:
    f.write('новая запись\n')
JavaScript (Node.js)

Используются асинхронные методы модуля fs: fs.writeFile (перезапись) и fs.appendFile (добавление).

const fs = require('fs').promises;

// Перезапись файла (асинхронно)
async function writeFileExample() {
    try {
        await fs.writeFile('file.txt', 'Содержимое', 'utf8');
    } catch (err) {
        console.error(err);
    }
}

// Добавление в конец файла
await fs.appendFile('log.txt', 'новая строка\n');
Bash/Shell

Перенаправление вывода с помощью > (перезапись) и >> (добавление).

# Перезапись файла
echo "Содержимое" > file.txt

# Добавление в конец файла
echo "Новая строка" >> log.txt
Типичные ошибки
Отсутствие прав на запись
<?php
// Попытка записи в системную директорию без прав
$result = file_put_contents('/etc/test.txt', 'данные');
if ($result === false) {
    echo "Ошибка записи. Проверьте права доступа.";
}
?>
Ошибка записи. Проверьте права доступа. (Возвращено false)
Некорректный путь к файлу
<?php
// Путь содержит несуществующие директории
file_put_contents('/несуществующий/путь/file.txt', 'данные');
?>
Warning: file_put_contents(/несуществующий/путь/file.txt): 
Failed to open stream: No such file or directory
Использование флага FILE_APPEND без проверки
<?php
// Файл может отсутствовать, но FILE_APPEND не создает его автоматически во всех версиях PHP
$result = file_put_contents('new_log.txt', 'запись', FILE_APPEND);
// В PHP 8 файл будет создан, в более ранних версиях может возникнуть ошибка.
?>

Рекомендуется сначала проверить существование файла или использовать флаги FILE_APPEND | LOCK_EX.

Изменения в последних версиях PHP
  • PHP 8.0: Функция теперь создает файл при использовании флага FILE_APPEND, если файл не существует. Ранее в этой ситуации могла возникать ошибка.
  • PHP 7.1: Добавлена поддержка передачи массива в параметр data. Элементы массива записываются без разделителей между ними.
Расширенные примеры
Использование контекста потока для HTTP-запроса
Пример php
<?php
// Создание контекста для записи данных POST на удаленный URL
$url = 'https://httpbin.org/post';
$data = http_build_query(['key' => 'value', 'test' => 'data']);

$options = [
    'http' => [
        'method'  => 'POST',
        'header'  => "Content-type: application/x-www-form-urlencoded\r\n",
        'content' => $data,
    ],
];

$context = stream_context_create($options);
// Здесь file_put_contents отправит POST-запрос
$result = file_put_contents($url, false, 0, $context);
echo "Получено байт: $result";
?>
Атомарное создание файла с проверкой
Пример php
<?php
$file = 'config.lock';
// Попытка создать файл, только если его нет (используем x в режиме fopen через контекст)
$context = stream_context_create([
    'ftp' => ['overwrite' => false] // Для FTP, для локальных файлов семантика может отличаться
]);
// Лучший способ - использовать LOCK_EX и проверку через file_exists
if (!file_exists($file)) {
    $written = file_put_contents($file, 'Lock file', LOCK_EX);
    if ($written) {
        echo "Файл блокировки создан";
    }
} else {
    echo "Файл уже существует";
}
?>
Логирование с временной меткой и ротацией
Пример php
<?php
function writeLog($message, $file = 'app.log') {
    $date = date('Y-m-d H:i:s');
    $entry = "[$date] $message\n";
    
    // Если файл больше 1 МБ, создаем новый с меткой времени
    if (file_exists($file) && filesize($file) > 1024 * 1024) {
        rename($file, $file . '.' . time());
    }
    
    file_put_contents($file, $entry, FILE_APPEND | LOCK_EX);
}

writeLog('Пользователь вошел в систему');
writeLog('Ошибка при обработке запроса');
?>
Сохранение сериализованных данных
Пример php
<?php
$data = [
    'users' => ['Алексей', 'Мария', 'Иван'],
    'settings' => ['theme' => 'dark', 'lang' => 'ru'],
    'last_update' => time()
];

// Сериализация и сохранение
$serialized = serialize($data);
file_put_contents('cache.data', $serialized, LOCK_EX);

// Чтение и десериализация
$restored = unserialize(file_get_contents('cache.data'));
print_r($restored['users']);
?>
Array
(
    [0] => Алексей
    [1] => Мария
    [2] => Иван
)
Запись с использованием буферизации вывода
Пример php
<?php
// Захват вывода скрипта в файл
ob_start();
echo "<h1>Отчет</h1>\n";
print_r([1, 2, 3, 4, 5]);
$htmlContent = ob_get_contents();
ob_end_clean();

file_put_contents('report.html', $htmlContent);
?>
Создание конфигурационного файла JSON
Пример php
<?php
$config = [
    'site' => [
        'name' => 'Мой сайт',
        'url' => 'https://example.com',
        'enabled' => true
    ],
    'database' => [
        'host' => 'localhost',
        'user' => 'admin'
    ]
];

// JSON_PRETTY_PRINT для читаемого формата
$json = json_encode($config, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
file_put_contents('config.json', $json);
?>

PHP file_put_contents function comments

En
File put contents Write data to a file