Работа с данными в файлах
Автор: | Артемьев Сергей Игоревич |
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() и сопутствующие ей функции.