HTML, Excel, Word, SEOPHP курс для чайников ⇒ Работа с данными в файлах

PHP для "чайников"

Инструменты
Выбираем IDE
Выбираем Web-сервер
Выбираем СУБД
Структура языка PHP
Первый шаг
Синтаксис
Типы данных
Переменные и константы
Операторы
Выражения
Управляющие структуры
Функции
Классы
Исключения
Ошибки
Массивы
Глобальные массивы
Cookies
Сессии
Загрузка файлов
Работа с файлами
Работа с файлами на диске
Работа с данными в файле
Пример управления файлами
Работа с базами данных
Подключение
Анализ результатов
Выполнение запросов
Отключение
Пример: отслеживание пользователей
Работа в сети
Отправка почты
Безопасность
HTTP-аутентификация
Защита логином и паролем
Автоматизация
Регулярные выражения в PHP
Интеграция
PHP и JavaScript

 

Работа с данными в файлах


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



В начало страницы



В начало страницы