Четверг, 16.05.2024, 22:01
DigitalBox
Приветствую Вас Гость | RSS
Главная Использование текстовых файлов Регистрация Вход
Меню сайта

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



Во многих приложениях требуется обеспечить длительное хранение информации. Непродолжительное хранение данных в сценариях РНР можно осуществить с помощью механизма сеансов (session). Однако зачастую информация должна быть доступна в любое другое время, например через день или на следующей неделе. Как уже говорилось ранее, после завершения сеанса это можно обеспечить с помощью данных cookie. Однако при их использовании разработчик не управляет режимом поддержки данных cookie. Пользователь может удалить или изменить информацию в любой момент или вообще отключить соответствующий режим в своем браузере. Поэтому информацию следует хранить в более безопасном месте с ограниченным доступом, например на сервере.

На сервере информация может храниться в текстовых файлах или в базе данных. Текстовые файлы хранятся в локальной файловой системе. Их можно прочитать с помощью команд операционной системы, например команды at систем Linux/Unix. Для редактирования таких файлов можно воспользоваться любым текстовым редактором, таким как Notepad или vi. Информация в файлах обычно хранится в строковой форме. Для ее извлечения сценарию РНР необходимо "знать" соответствующий формат. Например, для извлечения из файла имени покупателя сценарию РНР необходимо "знать" о том, что имена покупателей занимают первые 20 символов каждой строки.

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

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

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

Подводя итог, можно сказать, что текстовые файлы являются простым, эффективным и экономным (с точки зрения использования ресурсов) способом хранения небольших объемов информации. Они просты в использовании и обеспечивают быстрый доступ к данным. Кроме того, текстовый формат поддерживается различными редакторами и электронными таблицами. В то же время текстовые файлы доступны для всех, кто обладает правами на доступ к тpeбуемому каталогу, поэтому их можно использовать в качестве средства обмена информацией. Базы данных также имеют свои преимущества:

  • Безопасность. Кроме обеспечения безопасности на уровне операционной системы, базы данных предоставляют дополнительный уровень защиты. Информация в базах данных защищена от внешнего вторжения гораздо лучше, чем в простых файлах.
  • Поддержка сложной структуры данных. В базах данных можно хранить информацию с очень сложной структурой, различными типами данных и взаимосвязями. Это позволяет существенно упростить поиск и извлечение требуемой информации.
  • Поддержка многопользовательского режима. Если к одному и тому же файлу (например, с именами и адресами клиентов) обращаются много пользователей, то с помощью средств системы управления базами данных можно обеспечить согласованность данных и предотвратить опасность их затирания или потери.

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

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

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

  1. Открыть файл.
  2. Записать или извлечь данные из файла.
  3. Закрыть файл.

Каждый из этих этапов более подробно рассматривается в следующих разделах.


Доступ к файлам

Перед чтением или записью информации из файла необходимо его открыть. Для этого предназначена функция:

$fh = fopen("имя_файла", "режим");

Переменная $fh является дескриптором файла (file handle), который используется при чтении или записи данных в файл. Дескриптор файла содержит информацию о местоположении открытого файла.

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

Режим
Описание
Что происходит, если файл не существует
r
Только чтение
Выводится предупреждающее сообщение
r+
Чтение и запись
Выводится предупреждающее сообщение
w
Только запись
Создается новый файл. Если файл существует, новый файл перезаписывается поверх старого
w+
Чтение и запись
Создается новый файл. Если файл существует, новый файл перезаписывается поверх старого
a
Добавление данных в конец файла
Если файл не существует, создается новый файл
a+
Чтение и добавление данных в конец файла
Если файл не существует, создается новый файл

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


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

Для открытия файла file1.txt и считывания из него информации воспользуйтесь функцией fopen() со следующими параметрами:

$fh = fopen("file1.txt ","r");

В результате интерпретатор РНР выполнит поиск файла file1.txt в текущем каталоге. Текущим считается каталог, в котором расположен сценарий РНР. Если файл не существует, может быть выведено сообщение об ошибке (в зависимости от выбранного режима вывода сообщений об ошибках):

Warning: fopen(file1.txt): failed to open stream: No such file or directory in d:\test2.php on line 15

(Предупреждение: fopen(file1.txt): ошибка открытия потока: Файла или каталога не существует в файле d:\test2.php в строке 15)

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

Дня прерывания выполнения сценария в случае отсутствия файла воспользуйтесь фрагментом:

$fh = fopen("file1.txt", "r") or die("He удалось открыть файл");

Как упоминалосьранее, функция die() прерывает выполнение сценария и выводит заданное сообщение.

Открытие файла в режиме записи

Для открытия файла в заданном каталоге в режиме записи воспользуйтесь функцией fopen() со следующими параметрами:

$fh = fopen("с:/testdir/file1.txt", "w");

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

if(is_dir("с:/tester"))
{
     $fh = fopen("c:/testdir/file1.txt", "w");
}

Теперь открытие файла будет выполняться только в том случае, если существует требуемый каталог.


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

Файл, расположенный на другом Web-узле, можно открыть следующим образом:

$fh = fopen("http://janet.valade.com/index.html", "r");

URL-адрес можно использовать для открытия файлов только для чтения.


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

После использования файл нужно закрыть:

fclose($fh);

В качестве входного параметра функция использует дескриптор файла $fh, который ранее был создан при его открытии.


Запись в файл

После открытия файла можно приступать к записи в него различной информации, для этого предназначена функция fwrite() со следующим синтаксисом:

fwrite($fh, данные);

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

$today = date("Y-m-d");
$fh = fopen("file2.txt", "a");
fwrite($fh, $today);
fclose($fh);

В этом фрагменте текущая дата записывается в файл file2.txt. Причем файл открывается для добавления информации. Если при открытии файла не существовало, будет создан новый файл. При этом данные будут записаны в его первую строку. При открытии существующего файла текущая дата добавляется в конец файла. Таким образом, можно создать журнал регистрации, содержащий, например, время запуска сценария. Следует заметить, что функция fwrite() записывает в файл только ту информацию, которая была указана при ее вызове. Tак, после повторного запуска сценария содержимое файла будет выглядеть следующим образом:

2003-04-222003-04-22

Гораздо удобнее размещать различные даты в отдельных строках. Для этого функцию fwrite() нужно вызвать таким образом:

fwrite($fh, $today"\n");

После добавления символа \n файл file2.txt будет содержать следующие данные:

2003-04-22
2003-04-22

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


Чтение файла

Для чтения файла предназначена функция fgets() со следующим синтаксисом:

$line = fgets($fh);

где $fh— дескриптор файла, который был создан при его открытии. Функция fgets() считывает файл до тех пор, пока не будет достигнут конец строки или файла. При этом извлеченная информация сохраняется в переменной $line. Построчно можно прочитать весь файл. Для определения конца файла в языке РНР предназначена функция feof(). В следующем примере считываются и выводятся все строки файла:

while(!feof($fh))
{
     $line = fgets($fh);
     echo "$line";
}

Функция feof() возвращает значение TRUE при достижении конца файла с дескриптором $fh. Восклицательный знак в условном выражении цикла while обеспечивает чтение всех строк файла. Если приведенный фрагмент использовать для чтения журнала регистрации, созданного в предыдущем разделе, получим следующий результат:

2003-04-22
2003-04-22

Как можно увидеть, символ перевода строки используется функцией fgets() по умолчанию. В некоторых случаях этого не требуется, так что эти символы нужно удалить:

while(!feof($fh))
{
     $line = rtrim(fgets($fh));
     echo "$line";
}

Функция rtrim() удаляет пробелы в конце строки и символы перевода строки. Так что при ее использовании будет получен следующий результат:

2003-04-222003-04-22


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

Иногда из файла необходимо считать строки определенного размера. Для этого следует воспользоваться функцией fgets() со следующим синтаксисом:

$line = fgets($fh, n);

В данном случае строка длиной n-1 будет считываться до тех пор, пока не будет достигнут конец строки или файла. Например:

while(!feof($fh))
{
     $char4 = fgets($fh, 5);
     echo "$char4\n";
}

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

2003
- 0 4 -
22

2003
- 0 4 -
22

Обратите внимание, что после каждой строки по умолчанию используется символ перевода строки.


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

Зачастую содержимое всего файла удобно разместить в массиве. Это можно выполнить следующим образом:

$fh = fopen(file2.txt", "r");
while(!feof($fh))
{
     $content[] = fgets($fh);
}
fclose($fh);

В результате будет создан массив $content, ключами которого будут целые числа, а значениями — строки, считанные из файла. То же самое можно осуществить с помощью одной функции file(). При этом получится аналогичный результат:

$content = file(file2.txt");

Эта функция открывает файл, размещает строки в массиве $content и закрывает файл. Если открываемый файл очень большой, то использование функций file() может существенно замедлить работу сценария. Это зависит от размера доступной памяти на компьютере. Если сценарий действительно работает медленно, вместо функции file() следует воспользоваться функцией fgets(), а затем проверить, повлияло ли это на быстродействие.

Функцию file() можно использовать для открытия файлов во включаемом каталоге:

$content = file("file2.txt", 1);

Параметр 1 указывает, что поиск файла file2.txt следует осуществлять в каталоге включений, а не в текущем каталоге.


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

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

$content = file_get_contents("file2.txt", 1);

Функция file_get_contents() полностью аналогична file(), за исключением того, что содержимое файла размещается не в массиве, а в строке. Затем можно вывести значение переменной $content:

echo $content;

При этом получим следующий результат:

2003-04-22
2003-04-22

Обратите внимание, что символы перевода строки входят в состав строки $content и, естественно, учитываются при выводе.

Функция file_get_contents() появилась в PHP 4.3.O. В более ранних версиях она отсутствует.


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

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

Однако при взаимодействии со многими программными продуктами все же приходится считаться с используемым в них специальным форматом. Например, в адресной книге каждому фрагменту данных соответствует свое предопределенное место. Так, первые 20 символов строки могут использоваться для хранения имени, вторые 20 символов — для адреса и т.д. Поэтому для работы с файлами подобного типа нужно точно знать их формат. В сценарии РНР такой формат можно сгенерировать с помощью функции fwrite(), которая уже рассматривалась выше.

Файлы CSV (comma-separated values — значения, разделяемые запятой), иногда называемые также файлами с символами-разделителями , (comma-delimited file), являются стандартным средством обмена данными между различными приложениями. Файлы CSV могут использоваться для обмена информацией, содержащейся в таблице (со столбцами и строками). Такой формат поддерживается большинством табличных приложений (например, Microsoft Excel). Файлы CSV удобно использовать и при передаче данных между различными базами данных, такими как MySQL и Microsoft Access. Формат CSV достаточно распространен и поддерживается различным программными обеспечением.

CSV-файл имеет следующую структуру: каждая его строка соответствует строке таблицы, а значения, разделенные запятой, — столбцам. Рассмотрим следующий пример адресной книги, организованной с использованием файла CSV:

Джон Смит, ул. Дубов 1234, Большой город, OR, 99999
Мэри Джонс, Сосновая ул. 5678, Больший город, ME, 11111
Луис Рохас, ул. Вязов 1234, Самый большой город, ТХ, 88888

Excel позволяет прочитать этот файл и преобразовать его в таблицу, состоящую из пяти столбцов. При этом запятая используется в качестве символа-разделителя. Outlook Express также сможет импортировать этот файл в свою адресную книгу. Следующий фрагмент кода на языке РНР позволяет создать файл в формате CSV.

$address[] = "Джон Смит, ул. Дубов 1234, Большой город, OR, 99999";
$address[] = "Мэри Джонс, Сосновая ул. 5678, Больший город, ME, 11111";
$address[] = "Луис Рохас, ул. Вязов 1234, Наибольший город, ТХ, 88888";
$fh = fopen("addressbook.txt", "a");
for ($i=0; $i<3; $i++)
{
     fwrite($fh, $address[$i]."\n");
}
fclose($fh);

Для чтения CSV-файла можно воспользоваться функцией file() или fgets(), как описывалось выше, в разделе "Размещение файла в массиве". Однако специально для этих целей в языке РНР имеется функция fgetcsv(). При чтении файла с использованием этой функции каждая строка записывается в массив, элементами которого являются значения столбцов. Например:

$address = fgetcsv($fh, 1000);

В приведенной строке из файла с идентификатором $fh считывается строка дликой 1000 символов. Результатом выполнения функции fgetcsv() будет следующий массив:

$address[0] = Джон Смит
$address[1] = ул. Дубов 1234
$address[2] = Большой город
$address[3] = OR
$address[4] = 99999

Формат CSV очень удобно использовать при передаче данных между различными припожениями. Однако не забывайте о том, что если символ , является частью данных, то его нельзя использовать в качестве символа-разделителя. Рассмотрим следующую строку:

Компания Смита, мл., ул. Дубов 1234, Большой город, OR, 99999

Запятая используется в названии компании и соответственно при считывании приведёт к его разделению его на две части (столбца): Компания Смита и мл., т.е. вместо ожидавшихся пяти столбцов будет шесть. Для решения этой проблемы в качестве символа-разделителя следует использовать другой символ, например символ табуляции (\t) . (Именно так и поступают чаще всего.) В этом случае файл уже будет называться TSV (tab-separatedvalues — значения, разделенные символами табуляции). Для чтения такого файла можно воспользоваться функцией fgetcsv() такого вида:

$address = fgetcsv($fh, 1000, "\t");

В общем случае в качестве третьего параметра, т.е. разделителя, можно указать любой символ. В листинге А приведен сценарий, который преобразует файл CSV в файл TSV.

‹?php
/ * Имя сценария: Convert
   * Описание:          считывает CSV-файл и записывает данные в
   *                               TSV-файл. CSV-файл должен иметь расширение .CSV.
   */
     $myfile = " testing";                                                        #7
     function convert($filename)                                         #8
     {
          if(@$fh_in = fopen("{$filename}.csv", "r"))     #10
          {
               $fh_out = fopen("{$filename}.tsv", "a");     #12
               while(!feof($fh_in))                                               #13
               {
                    $line = fgetcsv($fh_in, 1024);                       #15
                    if($line[0] == "")                                               #16
                    {
                         fwrite($fh_out, "\n");
                    }
                    else {                                                                     #20
                         fwrite($fh_out,implode($line, "\t")."\n");     #21
                    }
               }
               fclose($fh_in);
               fclose($fh_out);
          }
          else {                                                                               #27
               echo "Файл не существует\n";
               return FALSE;
          }
          echo "Преобразование завершено!\n";
          return TRUE;                                                                  #32
     }
     convert($myfile);
?›

В листинге А некоторые строки пронумерованы. Ниже представлены соответствующие пояснения:

  • В строке 7 задается имя обрабатываемого файла.
  • В строке 8 определяется функция convert() с параметром $filename.
  • Строка 10. В этой строке для чтения открывается файл с расширением .csv. Если файл был успешно открыт, выполняется его преобразование в блоке if. В противном случае выполняется блок else строки 27.
  • Строка 12. В этой строке в режиме добавления открывается файл с расширением .tsv. Предполагается, что файл находится в текущем каталоге, т.е. там же, где расположен и сам сценарий.
  • Строка 13. В этой строке начинается цикл while, который завершается при достижении конца файла.
  • Строка 15. Строка файла считывается в массив $line. Каждый элемент массива содержит значение столбца.
  • Строка 16. В этой строке проверяется, содержит ли строка исходного файла какую-либо информацию. Если нет, выводится символ перевода строки (\n). Тем самым обеспечивается, что пустая строка исходного файла будет содержаться и в выходном файле.
  • Строка 20. Если строка исходного файла не пуста, выполняется ее преобразование в формат TSV и запись в файл.
  • Строка 21. В этой строке выполняется преобразование строки. При этом результат записывается в выходной файл. Функция implode() используется для преобразования массива $line в текстовую строку, в которой в качестве символов-разделителей применяются символы табуляции (\t).
  • Строка 27. Блок else выполняется в том случае, если исходный файл отсутствует. При этом выводится соответствующее сообщение об ошибке, а функция convert() возвращает значение FALSE.
  • Строка 32. Если функция выполнена успешно, возвращается значение TRUE.
  • Строка 34. В этой строке вызывается функция convert(), которой в качестве параметра передается значение переменной $myfile.

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz