Справочники, инструменты, документация

PHP: Запись и чтение файлов

Примеры сохранения и чтения текстовых данных и массивов в файлы.

Сохранение в файл

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

$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
$filename = __DIR__ . '/file.txt';

file_put_contents($filename, $text);

Набор функций fopen, fwrite, fclose предназначены для более гибкой работы с файлами.

  • fopen – открытие или создание файла.
  • fwrite – запись данных.
  • fclose – закрытие файла.
$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit.';
$filename = __DIR__ . '/file.txt';

$fh = fopen($filename, 'w');
fwrite($fh, $text);
fclose($fh);

Возможные режимы fopen():

  • r - Открывает файл только для чтения, помещает указатель в начало файла.
  • r+ - Открывает файл для чтения и записи, помещает указатель в начало файла.
  • w - Открывает файл только для записи, помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует – пробует его создать.
  • w+ - Открывает файл для чтения и записи, помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует – пытается его создать.
  • a - Открывает файл только для записи, помещает указатель в конец файла. Если файл не существует – пытается его создать.
  • a+ - Открывает файл для чтения и записи, помещает указатель в конец файла. Если файл не существует – пытается его создать.
  • x - Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт false и выдаст ошибку. Если файл не существует, попытается его создать.
  • x+ - Создаёт и открывает для чтения и записи, в остальном имеет то же поведение, что и «x».
  • c - Открывает файл только для записи. Если файл не существует, то он создаётся. Если же файл существует, то он не обрезается (в отличие от «w»), и вызов к этой функции не вызывает ошибку (также как и в случае с «x»). Указатель на файл будет установлен на начало файла.
  • c+ - Открывает файл для чтения и записи, в остальном имеет то же поведение, что и «c».

Доступно вместо fwrite() используют fputs(), разницы ни какой т.к. эта функция является псевдонимом.

Дописать строку в начало файла
$new_str = 'New line of text.';
$filename = __DIR__ . '/file.txt';

$text = file_get_contents($filename);
file_put_contents($filename, $new_str . PHP_EOL . $text);
Дописать строку в конец файла
$new_str = 'New line of text.';
$filename = __DIR__ . '/file.txt';

file_put_contents($filename, PHP_EOL . $new_str, FILE_APPEND);
Дописать строку в конец файла с fopen с флагом «c»
$new_str = 'New line of text.';
$filename = __DIR__ . '/file.txt';

$fh = fopen($filename, 'c');
fseek($fh, 0, SEEK_END); 
fwrite($fh, PHP_EOL . $new_str); 
fclose($fh);

Чтение из файла

Чтение всего файла
$filename = __DIR__ . '/file.txt';
$text = file_get_contents($filename);
echo $text;

или

$filename = __DIR__ . '/file.txt';

$text = '';
$fh = fopen($filename, 'r');
while (!feof($fh)) {
    $line = fgets($fh);
    $text .= $line . PHP_EOL;
}
fclose($fh);

echo $text;
Чтение файла в массив

Функция file() – читает содержимое файла и помещает его в массив, доступны опции:

  • FILE_IGNORE_NEW_LINES – пропускать новую строку в конце каждого элемента массива.
  • FILE_SKIP_EMPTY_LINES – пропускать пустые строки.
$filename = __DIR__ . '/file.txt';
$array = file($filename);
print_r($array);
Чтение файла сразу в браузер
$filename = __DIR__ . '/file.txt';
readfile($filename);
Получить первую строку из файла
$filename = __DIR__ . '/file.txt';
$fh = fopen($filename, 'r');
echo fgets($fh);
fclose($fh);

или

$filename = __DIR__ . '/file.txt';
$array = file($filename);
echo $array[0];
Первые три строки из файла
$filename = __DIR__ . '/file.txt';
$array = file($filename);
$first_3 = array_slice($array, 0, 3);
print_r($first_3);
Получить последнюю строку из файла
$filename = __DIR__ . '/file.txt';
$array = file($filename);
$last = array_slice($array, -1);
echo $last[0];
Последние три строки из файла
$filename = __DIR__ . '/file.txt';
$array = file($filename);
$last_3 = array_slice($array, -3);
print_r($last_3);

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

Serialize

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

Запись
$array = array('foo', 'bar', 'hallo', 'world');

$text = base64_encode(serialize($array));
file_put_contents(__DIR__ . '/array.txt', $text);
Чтение
$array = unserialize(base64_decode($text));
print_r($array);

JSON

Запись
$array = array('foo', 'bar', 'hallo', 'world');

$json = json_encode($array, JSON_UNESCAPED_UNICODE);
file_put_contents(__DIR__ . '/array.json', $json);
Чтение
$json = file_get_contents(__DIR__ . '/array.json');
$array = json_decode($json, true);
print_r($array);