Работа с данными в файлах
| Автор: | Артемьев Сергей Игоревич |
| ICQ: | 438856621 |
| email: | _spin_@bk.ru |
Для работы с данными внутри файла есть достаточно много функций. Мы рассмотрим только самые удобные и нужные в практической работе. Полный список вы сможете найти в официальной документации по PHP.
Для считывания содержимого файла в массив служит функция file(). Файл считывается построчно и каждая строка помещается в отдельный элемент массива. Функция принимает 2 параметра - имя файла и флаг. Флаг определяет режим чтения строк из файла. Например, при чтении можно игнорировать пустые строки и удалять символ перевода строки.
Например, прочитать и вывести в браузер все строки из файла можно следующим способом:
<?php
$lines = file('myconfig.txt');
foreach($lines as $single_line)
echo $single_line . "<br />\n";
?>
Если нужно просто читать и писать блоки текста, то проще всего воспользоваться парой функций file_get_contents() и file_put_contents(). Первая функция считывает и возвращает данные из файла в виде строки, а вторая - записывает блок текста в указанный файл. Пользоваться этими функциями очень просто:
<?php
$content = file_get_contents('myfile.txt');
$content = str_replace('{user_name}', 'Иван Петрович', $content);
file_put_contents('myfile.txt', $content);
?>
В этом примере мы считываем всё содержимое файла myfile.txt, заменяем все вхождения строки "{user_name}" на нормальное имя и отчество ("Иван Петрович"), после чего сохраняем изменённые данные обратно в файл. Пользоваться этими функциями очень удобно, когда надо считать всё содержимое файла (например, фрагмент страницы или шаблон письма электронной почты).
Следующие четыре функции позволяют осуществить так называемый "случайный" доступ к файлу. Термин "случайный" в данном случае означает, что в каком месте файла нам надо работать, в том мы и работаем, передвигаясь по файлу как хотим без всяких ограничений.
Функция fopen() открывает указанный файл и возвращает указатель на него. Функции передаётся имя файла и режим открытия. Режимы открытия могут быть следующие:
| 'r' | Файл открывается только для чтения, файловый указатель устанавливается на начало файла. |
| 'r+' | Файл открывается для чтения и записи, файловый указатель устанавливается на начало файла. |
| 'w' | Файл открывается только для записи, файловый указатель устанавливается на начало файла, размер файла ставится равным нулю, а если файл не существует - делается попытка создать его. |
| 'w+' | Файл открывается для чтения и записи, файловый указатель устанавливается на начало файла, размер файла ставится равным нулю, а если файл не существует - делается попытка создать его. |
| 'a' | Файл открывается только для записи, файловый указатель устанавливается на конец файла, а если файл не существует - делается попытка создать его. |
| 'a+' | Файл открывается для чтения и записи, файловый указатель устанавливается на конец файла, а если файл не существует - делается попытка создать его. |
| 'x' | Аналигично 'w', но если файл уже существует - функция вернёт ошибку. |
| 'x+' | Аналигично 'w+', но если файл уже существует - функция вернёт ошибку. |
Некоторые разработчики всегда и везде ставят режим 'w+', как наиболее удобный. Но с другой стороны, такой режим органичивает возможности Web-сервера по кешированию и управлению производительностью. Режимами нужно пользоваться соответственно ситуации, т.е. если вам нужно только читать файл - используйте 'r', если писать - 'w', а если дописывать в конец файла - 'a'.
Функции fread() и fwrite() служат для чтения и записи блока данных указанного размера в файл, ранее открытый функцией fopen().
Функция fclose() закрывает файл, открытый ранее функцией fopen().
Изменим пример для file_get_contents()/file_put_contents() с использованием новых функций:
<?php
$filename = 'myfile.txt';
// открываем файл для чтения/записи
if (!$handle = fopen($filename, 'w+')) {
echo "Не могу открыть файл '$filename'";
exit;
}
// считываем всё содержимое файла
$content = fread($handle, filesize($filename));
//изменяем содержимое
$content = str_replace('{user_name}', 'Иван Петрович', $content);
// записываем содержимое назад в файл
if (fwrite($handle, $content) === FALSE) {
echo "Не могу сохранить в файл '$filename'";
exit;
}
// закрываем открытый файл
fclose($handle);
?>
Замечательная особенность fopen() - можно открывать не только локальные файлы, но и URL. Например, можно открыть файл с Web или FTP-сервера и сохранить её в каталог сервера. Некоторые провайдеры запрещают такие операции в целях безопасности, но далеко не все.
<?php
// открытие локального файла
// $filename = 'myfile.txt';
// открытие Web-страницы
// $filename = 'http://www.example.com/';
// открытие файла на FTP-сервере
$filename = 'ftp://user:password@example.com/somefile.txt';
// открываем файл для чтения/записи
if (!$handle = fopen($filename, 'w+')) {
echo "Не могу открыть файл '$filename'";
exit;
}
// считываем всё содержимое файла
$content = fread($handle, filesize($filename));
//изменяем содержимое
$content = str_replace('{user_name}', 'Иван Петрович', $content);
// записываем содержимое назад в файл
if (fwrite($handle, $content) === FALSE) {
echo "Не могу сохранить в файл '$filename'";
exit;
}
// закрываем открытый файл
fclose($handle);
?>
Из примера видно, что изменилось только имя файла, а все остальные фрагменты остались нетронутыми. Этим приёмом можно пользоваться для сохранения чужих страниц у себя на сайте. Очень часто таким образом "грабятся" прайс-листы различных магазинов, новостные ленты, ленты объявлений и т.д. В большинстве случаев "грабёж" чужих сайтов незаконен, т.к. нарушает авторские права их владельцев.
Дополнительно стоит отметить такие функции как fseek(), ftell() и rewind(). Функция ftell() возвращает текущее положение файлового указателя, а функция fseek() позволяет переместить его в указанную позицию. Причем новая позиция может отсчитываться от начала файла, текущего положения, или конца файла. Например, так можно считать последние 10 символов из файла:
<?php
$filename = 'ftp://user:password@example.com/somefile.txt';
$handle = fopen($filename, 'w+');
// смещаемся на 10 байт от конца файла
fseek($handle, 10, SEEK_END);
// считываем всё содержимое файла
$content = fread($handle, 10);
// закрываем открытый файл
fclose($handle);
?>
Функция rewind() аналогична fseek(), но позволяет переместить файловый указатель только на начало файла.
Функции fseek() и rewind() работают при любом режиме открытия файла, но если файл открыт в режиме добавления (режимы 'a' или 'a+'), то данные всегда будут записываться в конец файла, даже если вы переместите файловый указатель на начало.
При работе с файлами надо обдуманно выбирать набор используемых функций. Если вам надо считывать все данные и выполнять какие-то массовые операции (замена слов, разбор текста и т.п.), то лучше использовать file(), file_get_contents() и file_put_contents(). Но если вы хотите иметь возможность построчного доступа, возможность обработки огромных файлов или файлов сложной структуры - нужно использовать fopen() и сопутствующие ей функции.