ProfiPHPProfiPHP
Категория: PHP для чайников

Хранение данных в текстовых файлов с использованием РНР

Любой крупный проект требуется длительного хранения информации. Частично можно решить данную проблему с помощью данных Cookie. Однако данное решение имеет ряд недостатков, поэтому информацию следует хранить в более безопасном месте с ограниченным доступом, например на сервере.

Сохраняться информация может в текстовых файлах или в базе данных. Текстовые файлы хранятся в локальной файловой системе. Их можно прочитать с помощью команд операционной системы и редактировать любым доступным способом. Информация в файлах обычно хранится в строковой форме.

Для использовании баз данных требуется установить специализированное программное обеспечение, например MySQL. Базы данных тоже представляют собой файлы, которые, однако, создаются соответствующими приложениями и могут быть доступны только через них.

При использовании баз данных необходимо иметь навыки работы с соответствующим программным обеспечением. Например, для получения нужной информации достаточно правильно сформулировать запрос на языке SQL, чтобы система управления базами данных обработала этот запрос и предоставила результат. При этом абсолютно не важно, где и в каком виде хранится требуемая информация.

Приведем преимущества использования текстовых файлов по сравнению с базами данных. I

- Простота и гибкость. Нам не нужно устанавливать дополнительное программное обеспечение для работы с базами данных. Достаточно создать файл средствами РНР и хранить в нем полезную информацию. Кроме того, текстовые файлы можно обрабатывать во многих текстовых редакторах или электронных таблицах.

- Экономия дискового пространства. Текстовые файлы занимают гораздо меньше дискового пространства, чем базы данных.

Текстовые файлы являются простым и эффективным с точки зрения использования ресурсов способом хранения небольших объемов информации. Они просты в использовании и обеспечивают быстрый доступ к данным. Текстовые файлы доступны для всех, кто обладает правами на доступ к требуемому каталогу, поэтому их можно использовать в качестве средства обмена информацией.

Базы данных, кроме обеспечения безопасности на уровне операционной системы, предоставляют дополнительный уровень защиты. Также база данных обладает поддержкой сложной структуры данных, различными типами данных и взаимосвязями. Это позволяет существенно упростить поиск и извлечение требуемой информации.

Еще одним преимуществом использования баз данных является поддержка многопользовательского режима, который обеспечивает согласованность данных и предотвращает опасность их затирания или потери. Все это достигается значительно большим используемым дисковым пространством.

Существует также и встроенная база данных SQLite, которая устанавливается вместе с интерпретатором PHP и предназначена для использования файлов и баз данных. При использовании расширения SQLite информация хранится в текстовых файлах, однако для доступа к ним применяется стандартный язык запросов SQL. Расширение SQLite удобно использовать для хранения и обработки небольших объемов данных, однако для организации большого хранилища данных все же лучше воспользоваться специализированными пакетами.

Использование текстовых файлов

При их использовании текстовых файлов не нужно устанавливать дополнительное программное обеспечение. Для чтения или записи в файл достаточно воспользоваться соответствующими операторами языка РНР.

Обработка тестовых файлов происходит в 3 этапа:

1. Открытие файла.

2. Запись или извлечение данных из файла.

3. Закрытие файла.

Для выполнения операций над файлом его необходимо открыть. Для этого предназначена функция Fopen, общий синтаксис которой:
$fh = fopen( 'имя_файла', 'режим' );
Переменная $fh является дескриптором файла (file handle), который используется при чтении или записи данных в файл. Дескриптор файла содержит информацию о местоположении открытого файла.

Для определения действий, которые будут выполнятся над файлом после его открытия, необходимо указать соответствующий режим. Опишем основные режимы:

'r' - Только чтение. Если файл не существует, выводится предупреждающее сообщение.

'r+' - Чтение и запись. Если файл не существует выводится предупреждающее сообщение.

'w' - Только запись. Создается новый файл. Если файл существует, новый файл полностью перезаписывает содержимое.

'w+' - Чтение и запись. Создается новый файл. Если файл существует, новый файл полностью перезаписывает содержимое.

'a' - Добавление данных в конец файла. Если файл не существует, создается новый файл.

'a+' - Чтение и добавление данных в конец файла. Если файл не существует, создается новый файл.

Параметр 'имя_файла' должен содержать имя файла (filename.txt), полный путь к нему (с:/localhost/filename.txt) или адрес URL (http://site.com/filename.txt).

Открытие файла в режиме чтения

Открыть файл и считать из него информацию поможет функция Fopen со следующими общими параметрами:
$fh = fopen( 'file.txt', 'r' );
В результате интерпретатор РНР выполнит поиск файла 'file.txt' в текущем каталоге, в котором расположен сценарий РНР. Если файл не существует, может быть выведено сообщение об ошибке:
Warning: fopen(file.txt): failed to open stream: No such file or directory in \test.php on line 3 
(Предупреждение: fopen(file.txt): ошибка открытия потока: Файла или каталога не существует в файле \test.php на строке 3)
Вывод предупреждения не приведет к прерыванию выполнения сценария, поэтому, чтобы избежать некорректной работы, в случае отсутствия файла воспользуйтесь функцией Exit, которая прерывает выполнение сценария и выводит заданное сообщение:
$fh = fopen( 'file.txt', 'r' ) or exit( 'He удалось открыть файл' );
Открытие файла в режиме записи
Открыть файл в заданном каталоге в режиме записи можно воспользовавшись следующим выражением:
$fh = fopen( '/content/file.txt', 'w' );
Если заданный файл не существует, будет создан новый файл. Однако, если отсутствует требуемый каталог, будет выведено сообщение об ошибке:
Warning: fopen(/content/file.txt): failed to open stream: No such file or directory in test.php on line 3
Проверить существование каталога можно следующим образом:
if ( is_dir( 'content' ) ) {
$fh = fopen( 'content/file.txt', 'w' );
}
Теперь открытие файла будет выполняться только в том случае, если существует требуемый каталог.

Открытие файла на другом Web-узле

Если файл размещен на другом Web-узле, его можно открывать только в режиме для чтения:
$fh = fopen( 'http://profiphp.ru/functions_filesystem/fopen.html', 'r' );
Закрытие файла

После использования файла его обязательно нужно закрыть функцией Fclose:
fclose( $fh ); 
В качестве входного параметра функция использует дескриптор файла $fh, который ранее был создан при его открытии.

Запись в файл

Для записи в файл различной информации предназначена функция Fwrite со следующим общим синтаксисом:
fwrite( $fh, данные ); 
Параметрами этой функции являются дескриптор файла $fh, созданный при его открытии, и данные, которые необходимо сохранить. В качестве данных можно использовать текстовую строку или переменную. Например:
$fh = fopen( 'file.txt', 'a' );
fwrite( $fh, 'Информация' );
fclose( $fh );
В этом фрагменте файл открывается для добавления информации. Если при открытии файла не существовало, будет создан новый файл. При этом данные будут записаны в его первую строку. При открытии существующего файла текущая информация добавляется в конец файла.

Гораздо удобнее размещать различную информацию в отдельных строках. Для этого функцию Fwrite нужно вызвать таким образом:
fwrite( $fh, "Информация \n" );
Если в файл нужно добавить информацию, его необходимо открыть в режиме 'а'. При открытии в режиме записи файл каждый раз будет создаваться заново, а информация - перезаписываться.

Чтение файла

Для чтения файла предназначена функция Fgets со следующим синтаксисом:
$line = fgets( $fh );
где $fh - дескриптор файла, который был создан при его открытии. Функция Fgets считывает файл до тех пор, пока не будет достигнут конец строки или файла. В указанном примере информация сохраняется в переменной $line. Построчно можно прочитать весь файл. Для определения конца файла в языке РНР предназначена функция Feof. В сле­дующем примере считываются и выводятся все строки файла:
while( ! feof( $fh ) ) { 
$line = fgets( $fh );
echo $line. "<br />";
}
Функция Feof возвращает значение TRUE при достижении конца файла с дескриптором $fh. Восклицательный знак в условном выражении цикла While обеспечивает чтение всех строк файла.

Символ перевода строки используется функцией Fgets по умолчанию. В некоторых случаях этого не требуется, так что эти символы нужно удалить:
while( ! feof( $fh ) ) {
$line = rtrim( fgets( $fh ) );
echo $line;
}
Функция Rtrim удаляет пробелы в конце строки и символы перевода строки. Так что при ее использовании будет получен следующий результат в одну строку.

Чтение файлов по частям

Для считывания строки определенного размера следует использовать функцией Fgets со следующим синтаксисом:
$line = fgets( $fh, n );
В данном случае строка длиной n-1 будет считываться до тех пор, пока не будет достигнут конец строки или файла. Например:
while ( ! feof( $handle ) ) {
echo fgets( $handle, 10 )."\n";
}
В приведенном фрагменте считываются каждые десять символов, пока не будет достигнут конец файла. Обратите внимание, что после каждой строки по умолчанию используется символ перевода строки.

Размещение файла в массиве

Разместить содержимое всего файла в массиве можно следующим образом:
$fh = fopen( 'file.txt', 'r' );
while ( ! feof( $fh ) ) {
$content[] = fgets($fh);
}
fclose( $fh );
В результате будет создан массив $content, ключами которого будут целые числа, а значениями - строки, считанные из файла.

То же самое можно осуществить с помощью одной функции File. При этом получится аналогичный результат:
$content = file( 'file.txt' );
Функция File открывает файл, размещает строки в массиве $content и закрывает файл. Следует следить за объемом использованной памяти, поскольку, если открываемый файл очень большой, то использование функций File может существенно замедлить работу сценария. Для ускорения быстродействия, где это возможно, вместо функции File следует пользоваться функцией Fgets.

Размещение файла в строке

Содержимое файла можно разместить в одной длинной строке. Для этого предназначена функция File_get_contents:
$content = file_get_contents( 'file.txt' );
Функция File_get_contents полностью аналогична File, за исключением того, что содержимое файла размещается не в массиве, а в строке. Символы перевода строки входят в состав результирующей строки $content и, естественно, учитываются при выводе.

Обмен данными с другими программами

Благодаря использованию файлов, можно обеспечить взаимодействие сценариев РНР с другими приложениями. Практически все без исключения программы предоставляют возможность считывания или записи данных в файл и последующим взаимодействием с другими приложениями.

Для работы с файлами необходимо точно знать формат сохранения информации. В сценарии РНР такой формат можно сгенерировать с помощью функции Fwrite.

Файлы CSV (Comma-Separated Values - значения, разделяемые запятой), иногда называемые также файлами с символами-разделителями, (comma-delimited file), являются стандартным средством обмена данными между различными приложениями. Файлы CSV могут использоваться для обмена информацией, содержащейся в таблице (со столбцами и строками) и используется текстовыми редакторами, например OpenOffice Calc. Формат CSV достаточно распространен и поддерживается различным программными обеспечением.

CSV-файл имеет следующую структуру: каждая его строка соответствует строке таблицы, а значения, разделенные запятой, - столбцам. Рассмотрим следующий пример легковых автомобилей, организованной с использованием файла CSV:
Opel, красный, 1988
Mercedes, белый, 2000
BMW, черный, 2010
OpenOffice Calc позволяет прочитать этот файл и преобразовать его в таблицу, состоящую из трех столбцов. При этом запятая используется в качестве символа-разделителя.

Следующий фрагмент кода на языке РНР позволяет создать файл в формате CSV.
$car[] = 'Opel, красный, 1988';
$car[] = 'Mercedes, белый, 2000';
$car[] = 'BMW, черный, 2010';
$fh = fopen( 'car.txt', 'a' );
for ( $i = 0; $i < 3; $i++ ) {
fwrite( $fh, $car[$i]."\n" );
}
fclose( $fh );
Для чтения CSV-файла можно воспользоваться функцией File или Fgets. Однако специально для этих целей в языке РНР имеется функция Fgetcsv, которая при чтении файла каждую строку записывает в массив, элементами которого являются значения столбцов. Например:
$car = fgetcsv( $fh, 1000 );
В приведенной строке из файла с идентификатором $fh считывается строка длиной
1000 символов. Результатом выполнения функции Fgetcsv будет следующий массив:
Array
(
[0] => Opel
[1] => красный
[2] => 1988
)
Формат CSV очень удобно использовать при передаче данных между различными приложениями. Однако не забывайте о том, что если символ ',' является частью данных, то его нельзя использовать в качестве символа-разделителя.

Добавить комментарий

Имя:
Текст комментария: