Базы данных MySQL и Access все чаще становятся общедоступными средствами хранения данных. Но в начале 1990-х была популярна работа с файлами в PHP, сохранение записей в форматированных текстовых файлах в формате CSV, разделенных новыми строками.
Основные принципы работы
Базы данных удобны, но каждый разработчик должен по крайней мере иметь некоторые базовые знания о том, как читать и писать файлы. Возможно, многие задумаются над вопросом: «Почему мне нужно это знать? Если я использую файлы, они написаны в XML, и я просто применяю синтаксический анализатор».
Итак, вот несколько причин, по которым могут понадобиться файлы:
- Чтобы переместить двоичные данные (например, файлы изображений) в базу данных BLOB (двоичные большие объекты).
- Импорт данных (например, адресов электронной почты), экспортированных из устаревшей базы данных или приложения.
- Чтобы из базы данных экспортировать информацию в текстовый файл для обработки в автономном режиме.
Чтение файлов и запись — это основные операции. Если нужно прочитать документ, то сначала требуется его открыть. После этого следует прочесть как можно больше содержимого, затем закрыть файл. Для записи информации в документ, нужно его вначале открыть (или, возможно, создать, если он еще не создан). После этого записывают необходимые данные и закрывают его по завершении.
Удобно использовать и встроенные функции, которые автоматически совершают открытие и закрытии. Они доступны в PHP5.Также следует ознакомиться с атрибутами файлов, то есть с его свойствами.
Они могут рассказать:
- о размере;
- выдать информацию о том, когда последний раз к нему обращались;
- рассказать о владельце и т. д.
Лучше всего выучить все основные атрибуты для работы с файлами в PHP. Это во многом облегчит работу.
История файлов
Может понадобится узнать время последнего редактирования файла. В этом случае на помощь приходят функции: fileatime(), filemtime() и filectime().
<?php $formatDate = "D d M Y g:i A"; $timeA = fileatime($file); $timeM = filemtime($file); $timeC = filectime($file); echo $file . "был просмотрен" . date($formatDate, $timeA) . ".<br>"; echo $file . " имел последнее изменение i-узла " . date($formatDate, $timeM) . ".<br>"; echo $file . " был изменен " . date($formatDate, $timeC) . ".";
Здесь код извлекает временную метку последнего доступа и отображает ее:
- C: Windowsfile.ini был просмотрен 19 сен 2018 4:34 вечера.
- C: Windowsfile.ini был изменен Пт 8 окт 2018 2:03 утра.
- C: Windowsfil.ini был изменен в Вт 16 дек 2017 4:34.
Функция filectime() показывает время изменения разной информации, связанной с файлом (например, права доступа), а filemtime() — изменения самого файла.
Функция date() использовалась для форматирования временной метки Unix, возвращаемой file*time() функциями.
Файл или нет?
Чтобы узнать, действительно ли происходит работа с файлами в PHP, можно использовать is_file() функцию или is_dir(), проверяющие, каталог ли это.
<?php echo $file . (is_file($file) ? " " : " не") . " файл.<br>"; echo $file . (is_dir($file) ? " " : " не") . " каталог.";
Вывод кода примера:
- C: Windowsfile.ini файл.
- C: Windowsfile.ini не каталог.
Таким образом можно избежать ошибок и не открыть по неосторожности «не файл». В PHP работа с файлами и каталогами аналогична.
Разрешения для файлов
Перед работой с файлом можно проверить, является ли он доступным для чтения или записи. Для этого нужно использовать функции is_writable() и is_readable().
<?php echo $file . (is_readable($file) ? " " : " не") . " читается.<br>"; echo $file . (is_writable($file) ? " " : " не") . " записывается.";
Эти функции возвращают логическое значение и объясняют, может ли операция быть выполнена в файле.
Код выведет следующие значения на экран:
- C: Windowsfile.ini читается.
- C: Windowsfile.ini не записывается.
Используя тернарный оператор, можно указать, доступен файл или нет.
Размер файла
Чтобы узнать размер файла, нужно использовать функцию filesize(). Он будет показан в байтах.
<?php $file = "C:Windowsfile.ini";$size = filesize($file); echo $file . " имеет размер " . $size . " байт.";
Функция выведет на экран следующее:
- C: Windowsfile.ini имеет размер 510 байт.
Использование файла в системе Windows здесь подчеркивает один нюанс. Обратная косая черта имеет особое значение в качестве символа escape. Нужно будет избегать этого, добавив еще одну обратную косую черту.
Если файл еще не создан, функция filesize() укажет на False и ошибку. Поэтому вначале проверяют файл на существование нужной команды file_exists().
<?php $file = "C:Windowsfile.ini";if (file_exists($file)) { $size = filesize($file); echo $file . " имеет размер " . $size . " байт.";}else { echo $file . " файл не найден.";}
Проверку file_exists() нужно включать практически всегда для безопасности.
Чтение файлов
В предыдущем разделе показано, как много можно узнать о файлах, с которыми работаете, прежде чем начинать читать или записывать в них. Теперь можно разобрать с тем, каким образом происходит чтение содержимого файла.
Функции для работы с файлами PHP облегчают задачу. В данном случае понадобится file_get_contents(). Она будет считывать все содержимое файла в переменную без необходимости открывать или закрывать файл самостоятельно. Это удобно, когда объем записи относительно невелик, так как сразу считывать 1 ГБ данных в архив не всегда рационально в PHP. Работа с «.ini»-файлами и функцией file_get_contents() показана ниже.
<?php $file = "c:windowsfile.ini";$file1 = file_get_contents($file); echo $file1;
Для больших файлов или просто в зависимости от потребностей вашего скрипта, может быть разумнее обрабатывать детали самостоятельно. Это связано с тем, что как только файл открывается, вы можете искать в нем определенное замечание и читать столько данных, сколько захотите. Функция fopen() используется для открытия файла.
<?php $file = "c:windowsfile.ini";$file1 = fopen($file, "r");
Для работы с функцией fopen() необходимы два аргумента:
- файл, который нужно открыть;
- режим, используемый в этом случае является «r» для чтения.
Функция возвращает дескриптор или поток в файл, который хранится в переменной $file1. Ее нужно использовать во всех последующих командах при работе с файлом.
Режим | Значение | Позиция курсора | Если файла не существует? |
r | только чтение | начало файла | выдаст ошибку |
w | только запись | начало файла | создаст новый |
a | только запись | конец файла | создаст новый |
С целью чтения из открытого файла по одной строке за раз, использовать можно функцию fgets().
<?php $file = "c:windowsfile.ini";$file1 = fopen($file, "r"); do { echo fgets($file1) . "<br>";} while (!feof($file1)); fclose($file1);
Использование do-while-цикла является хорошим выбором, чтобы узнать заранее, сколько строк в файле. Функция feof() проверяет, достиг ли файл завершения, а цикл продолжается до тех пор, пока не будет достигнут конец условия файла. После окончания чтения используется функция fclose() для закрытия документа.
Запись файлов
Два часто используемых режима при записи в файл с использованием функции fwrite(): «w» и «a». «W» означает, что нужно записать в документ, но он предварительно удалит любое содержимое, «a» — добавление новых данные к тому, что уже существует в файле. Нужно быть уверенным, что используется правильный вариант.
В следующем примере будет использоваться режим «a» для записи.
<?php $myFile = "files.txt";$file1 = fopen($myFile, "a"); $output = "банан" . PHP_EOL;fwrite($file1, $output); $output = "Китай" . PHP_EOL; fwrite($file1, $output); fclose($file1);
Сначала имя файла назначается переменной, затем он открывается в режиме «a» для добавления. Данные, которые должны быть записаны, назначаются переменной $output и fwrite(), а информация добавляется в файл. Процесс повторяется, чтобы добавить еще одну строку, затем документ закрывается с использованием fclose().
Предварительно определенная константа PHP_EOL добавляет символ новой строки, специфичный для платформы, на которой работает PHP с текстовыми файлами.
Содержимое файла после выполнения вышеуказанного кода должно выглядеть следующим образом:
- банан;
- Китай.
Функция file_put_contents() также может записывать в файл. Она принимает имя файла, данные, которые должны быть записаны и константу FILE_APPEND, если она должна добавить данные (будет перезаписывать содержимое файла по умолчанию).
Вот такой же пример, как и выше, но на этот раз используется file_put_contents().
<?php $myFile = "files.txt"; file_put_contents($myFile, "банан" . PHP_EOL); file_put_contents($myFile, "Китай" . PHP_EOL, FILE_APPEND);
С этими функциями приходится работать часто, поэтому лучше их запомнить. К тому же они могут в работе с файлами PHP однажды облегчить некоторые сложные задачи.