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

Как я уже говорил в прошлом посте, в качестве хранилища данных можно использовать и обычные текстовые файлы. Хоть их использовать и не рекомендуют, т.к. скорость взаимодействия с ними ниже, чем с БД, но функции для работы с ними пригодятся. Одну из них мы уже использовали в статье «Основные функции на примере парсера XML» – это file_get_contents(), которая, напомню, получает содержимое файла в виде одной строки. Это что касается чтения. Думаю сначала логично рассмотреть как записать данные в файл, а потом уже их получать из него.

Начнем с этого:

<?php
$content = 'Этот текст пишем в файл';
$f = fopen('test.txt','w+');
fwrite($f,$content);
fclose($f);
?>

Строка, которую будем записывать в файл находиться в переменной $content. Затем функция fopen() попытается открыть поток к файлу test.txt, который находится в той же директории что и скрипт. Второй параметр (‘w+’ – в нашем случае) указывает тип доступа, который вы запрашиваете у потока. Он может быть одним из следующих:

mode Описание
‘r’ Открывает файл только для чтения; помещает указатель в начало файла.
‘r+’ Окрывает файл для чтения и записи; помещяет указатель в начало файла.
‘w’ Открывает файл только для записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует – пробует его создать.
‘w+’ Открывает файл для чтения и записи; помещает указатель в начало файла и обрезает файл до нулевой длинны. Если файл не существует – пробует его создать.
‘a’ Открывает файл только для записи; помещает указатель в конец файла. Если файл не существует – пытается его создать.
‘a+’ Открывает файл для чтения и записи; помещает указатель в конец файла. Если файл не существует – пытается его создать.
‘x’ Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст предупреждение уровня E_WARNING. Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2). Эта опция поддерживается начиная с версии PHP 4.3.2 и выше, и работает только для локальных файлов.
‘x+’ Создаёт и открывает для чтения и записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт FALSE и выдаст предупреждение уровня E_WARNING. Если файл не существует, попытается его создать. Это эквивалентно указанию флагов O_EXCL|O_CREAT для внутреннего системного вызова open(2). Эта опция поддерживается начиная с версии PHP 4.3.2 и выше, и работает только для локальных файлов.
Далее функция fwrite() запишет данные из $content в поток $f. Затем fclose() закроет файл.

Но есть и более простой способ записи в файл – это использование функции file_put_contents(), которая появилась в PHP 5 и идентична последовательному вызову функций fopen(), fwrite() и fclose().Возвращаемым функцией значением является количество записанных в файл байтов.

Вот пример:

<?php
$content = 'Этот текст пишем в файл';
file_put_contents ('test.txt',$content);
?>

Теперь что касается чтения.

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

<?php
$data_array = file('test.txt');
foreach($data_array as $k=>$v)
{
echo 'Строка номер '.($k+1).' содержит данные: '.$v.'<br/>';
}
?>

Если же необходимо считать файл не в массив, а в строку, то можно использовать функцию implode(), которая объединяет массив в строку:

<?php
$data_string = implode('',file('test.txt'));
?>

Так же в PHP 5 есть функция file_get_contents(), которой мы пользовались, чтобы получить содержимое XML-файла в статье «Основные функции на примере парсера XML». Только вместо имени файла мы использовали URL.

<?php
$data_string = file_get_contents('test.txt');
?>

Так же в PHP есть специальная функция, которая позволяет проверить существует файл или нет еще до его открытия. Это функция file_exists().

<?php
if(file_exists('test.txt'))
{
echo 'Файл на месте';
}
else
{
echo 'Файла нет!';
}
?> 

Общее описание некоторых функций для работы с файлами дал. Какие из них использовать решайте сами. Более подробное описание функций см. в официальной документации.