PHP: чтение PHP-файла. Работа с файлами в PHP: чтение, запись и рекомендации

А сейчас будет достаточно большой, но не сложный урок о работе с файлами в php. Для начала, для чего нужны файлы? Ведь можно все хранить в базе данных MySQL или PostgreSQL или любой другой. Но иногда бывают такие задачи, когда использование БД, со всеми обработками и заботой о безопасности соединения, не целесообразно. Например нужно сделать обычный счетчик, а до этого в проекте у нас БД не использовалась. Так что нам, ради одного малюсенького счетчика заводить базу данных и хранить в ней всего пару строк? тут гораздо проще воспользоваться файлами. К тому же, иногда на хостинге вообще нет поддержки баз данных, тогда файлы вообще остаются единственным выходом.

Ну, допустим я вас убедил, что файлы необходимы:) Теперь давайте разбираться, как же с ними работать. Как создавать, открывать, записывать, перезаписывать, читать и так далее. Обо всем по порядку.

Создаем файл

В PHP для открытия файлов используется функция fopen. Тем не менее, она также может и создавать файлы. Если передать fopen имя файла, которого не существует, то она создаст его.

Сама функция fopen принимает два параметра, оба они обязательны. Во-первых, мы должны указать имя файла, который хотим открыть. Во-вторых, передать параметр, который объясняет функции, что мы планируем делать с этим файлом (например, чтение из файла, запись и так далее).

Если нужно создать файл, то указываем его имя и передаем параметр, что мы хотим записать в него данные. Обратите внимание: Мы должны обязательно сказать PHP, что мы пишем в файл, в противном случае она не будет создавать новый файл.
Пример:

$ourFileName = "testFile.txt"; $ourFileHandle = fopen($ourFileName, "w") or die("can"t open file"); fclose($ourFileHandle);

Первая строчка $ourFileName = testFile.txt создает , в которой мы будем хранить имя файла.
Вторая строчка $ourFileHandle = fopen($ourFileName, ‘w’) or die(«can’t open file») соответственно создает или открывает уже существующий файл на запись. Или же возвращает сообщение, что не может открыть файл.
Третья строчка fclose($ourFileHandle) закрывает файл. На самом деле все просто.

Параметры открытия файла в php

  • Первый параметр ‘r’ (read) — открывает файл только на чтение, записывать в него будет нельзя.
  • Второй параметр ‘w’ (write) — открывает для записи. При этом всегда запись будет идти с начала файла. Если там уже есть какая то информация — то она будет перезаписана.
  • Третий параметр ‘a’ (append) — открывает файл на запись, но при этом будет дописывать в конец файла, в отличие от w.

Расширенные параметры:

  • Параметр ‘r+’ — открывает и на чтение и на запись. Указатель будет в начале файла.
  • Параметр ‘w+’ — открывает и на чтение и на запись, НО удаляет всю информацию, которая была в файле!!!
  • араметр ‘a+’ — открывает на чтение и запись, но указатель будет в конце файла.

Естественно, что функции можно передать только один из этих параметров, а не несколько. Их нужно подставлять вместо ‘X’:

Fopen($ourFileName, "X")

Запись в файл

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

$myFile = "testFile.txt"; $fh = fopen($myFile, "w") or die("can"t open file"); $stringData = "Первая строчка\n"; fwrite($fh, $stringData); $stringData = "Вторая строчка\n"; fwrite($fh, $stringData); fclose($fh);

Создали файл testFile.txt, указатель на него хранится в переменной $fn. Записали в него строчку «Первая строчка» (в конце применили символ конца строки \n), а затем и «Вторая строчка». После чего закрыли файл.

ВНИМАНИЕ! Никогда не забывайте закрывать ваши файлы! Иначе в случае аварийного завершения выполнения скрипта — данные в файлах не сохранятся! Всегда после работы используйте fclose!!!

Чтение из файла

Записать записали, теперь давайте прочитаем! Это тоже не так сложно. Используем функцию fread. На вход ей подаем указатель на файл и количество байт, которое хотим прочитать. Например, один символ равен одному байту (зависит от кодировки), мы хотим прочитать 5 символов: $theData = fread($fh, 5).
Но если нужно получить всю информацию, которая есть в файле, то тут нам понадобится функция filesize, которая возвращает количество байт в файле, следовательно, если результат функции filesize передать в fread, то мы получим полностью всю информацию из файла:

$myFile = "testFile.txt"; $fh = fopen($myFile, "r"); $theData = fread($fh, filesize($myFile)); fclose($fh); echo $theData;

Надеюсь понятно объяснил.
Иногда же полезно читать файл построчно, а не по количеству байт. Для этого вместо fread нужно просто использовать fgets:

$myFile = "testFile.txt"; $fh = fopen($myFile, "r"); $theData = fgets($fh); fclose($fh); echo $theData;

В результате получим первую строчку из файла testFile.txt. Соответственно, чтобы пройтись по всем строчкам нужно использовать :

\n"; ?>

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

PHP - Работа с файлами

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

Работа с файлами разделяется на 3 этапа:

  • Открытие файла.
  • Манипуляции с данными.
  • Закрытие файла.

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

Для того чтобы открыть файл в среде PHP используется функция fopen(). Обязательными параметрами этой функции является имя файла и режим файла.

Согласно документации PHP выделяют следующие виды режимов файлов:

  • r – открытие файла только для чтения.
  • r+ - открытие файла одновременно на чтение и запись.
  • w – создание нового пустого файла. Если на момент вызова уже существует такой файл, то он уничтожается.
  • w+ - аналогичен r+, только если на момент вызова файла такой существует, его содержимое удаляется.
  • a – открывает существующий файл в режиме записи, при этом указатель сдвигается на последний байт файла (на конец файла).
  • a+ - открывает файл в режиме чтения и записи при этом указатель сдвигается на последний байт файла (на конец файла). Содержимое файла не удаляется.

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

Для демонстрации рассмотрим следующий сценарий:

//Открывает файл в разных режимах

$fp = fopen("counter.txt", "r"); // Бинарный режим

$fp = fopen("counter.txt", "rt"); // Текстовый режим

$fp = fopen("http://www.yandex.ru", "r");// Открывает HTTP соединение на чтение

$fp = fopen("ftp://user:[email protected]", "w"); //Открываем FTP соединение с указанием логина и пароля

II. Манипуляции с данными файла

Записывать данные в файл при помощи PHP можно при помощи функции fwrite(). Это функция принимает 2 обязательных параметра и 1 необязательный. В качестве обязательных параметров выступает дескриптор файла и режим файла:

$fp = fopen("counter.txt", "a"); // Открываем файл в режиме записи

$mytext = "Это строку необходимо нам записать\r\n"; // Исходная строка

$test = fwrite($fp, $mytext); // Запись в файл

If ($test)

Echo "Данные в файл успешно занесены.";

Else

Echo "Ошибка при записи в файл.";

Fclose($fp); //Закрытие файла

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

If ($fp)

While (!feof($fp))

$mytext = fgets($fp, 999);

Echo $mytext."
";

Else

Fclose($fp);

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

Echo readfile("counter.txt");

Также можно использовать функцию fpassthru() которая принимает 1 обязательный параметр. Перед использованием этой функции необходимо открыть файл в режиме чтения. По окончанию считывания файла функция автоматически закрывает файл(при этом дескриптор файла становиться недействительным).

$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения

If ($fp)

Echo fpassthru($fp);

Else

Echo "Ошибка при открытии файла";

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

Примечание: Не следует применять функцию file() к двоичным файлам (binary-safe), т.к. она не является безопасной в плане считывания двоичных файлов, если при этом, где-то встретиться символ конца файла (EOF), то она не гарантирует вам чтение всего двоичного файла.

$file_array = file("counter.txt"); // Считывание файла в массив $file_array

// Работа с данными массива

Примечание: Работа с массивами подробно описывается здесь, авторы: Мухаметшин Д.Ф., Симдянов И.В.

В конце статьи, вы найдете хороший «сборник рецептов» по массивам, который дает решение многих проблем, с которыми ежедневно встречается веб-программист.

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

$fp = fopen("counter.txt", "r"); // Открываем файл в режиме чтения

If ($fp)

While(!feof($fp))

$char = fgetc($fp);

If ($char == "с")

$i = $i + 1;// Находим символ «с»

Echo "Количество букв "c" в файле: ". $i;

Else echo "Ошибка при открытии файла";

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

Закрытие файла происходить с помощью функции fclose(), которая принимает 1 обязательный параметр.

$fp = fopen("counter.txt", "r");

If ($fp)

Echo "Файл открыт";

Fclose($fp); // Закрытие файла

Сборник рецептов

1) Нам необходимо проверить существует ли тот или иной файл. Для этого мы воспользуемся функцией file_exists().

myfile("counter.txt"); // Используем функцию myfile, передав в качестве аргумента имя файла

function myfile($name) //Создаем функцию для проверки существования файла

If (file_exists($name)) echo "Файл существует";

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

2) Определяем размер файла с помощью функции filesize()

myfile("counter.txt");

//Создаем функцию для проверки существования файла и определения размера файла

function myfile($name)

If (file_exists($name)) echo "Размер файла: ".filesize($name)." байт";

Else echo "Файл не существует";

3) Создание временного файла с помощью функции tmpfile()

$myfile = tmpfile();

// Записываем во временный файл

Fwrite($myfile, "Эта строка записывается во временный файл.");

Fseek($myfile, 0); // Устанавливаем указатель файла

Echo fread($myfile, 1024); // выводим содержимое файла

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

$fp = file("counter.txt");

Echo "Количество строк в файле: ".count($fp);

5) Нам необходимо использовать механизм блокировки файла

$fp = fopen("counter.txt", "a");

Flock($fp, LOCK_EX); // Блокирование файла для записи

Fwrite($fp, "Строка для записи");

Flock($fp, LOCK_UN); // Снятие блокировки

Fclose($fp);

6) Нам необходимо удалить определенную строку из файла

$num_stroka = 5; //Удалим 5 строку из файла

$file = file("counter.txt"); // Считываем весь файл в массив

For($i = 0; $i < sizeof($file); $i++)

If($i == $num_stroka) unset($file[$i]);

$fp = fopen("counter.txt", "w");

Fputs($fp, implode("", $file));

Fclose($fp);

7) Определение типа файла. Используем функцию filetype(), которая принимает единственный параметр

$mytype = filetype("counter.txt");

Echo "Тип файла: ".$mytype;

После вызова строка может содержат одно из следующих значений:

file – обычный файл

dir – каталог

fifo – fifo-канал

block – блочно - ориентированное устройство

char – символьно - ориентированное устройство

unknown – неизвестный тип файла

8) Если вы хотите просмотреть все параметры файла, то следует воспользоваться функцией stat()

$filename = stat("counter.txt");

Echo "

";

Print_r($filename);

Echo "

";

9) Нам необходимо очистить файл, используем функцию ftruncate()

$fp = fopen("counter.txt", "a"); //Открываем файл в режиме записи

Ftruncate($fp, 0) // очищаем файл

10) Нам необходимо узнать дату последнего изменения файла, используем функцию filectime(). Функция возвращает значение времени в форме Unix timestamp.

Echo filectime("counter.txt");

Об использовании функций fopen, fclose, feof, fgets, fgetss, и fscanf

Давайте перечислим все возможности

Одним из преимуществ работы с современными языками программирования, такими как PHP, является количество доступных возможностей. PHP легко мог бы присвоить девиз языка Perl, "Существует несколько способов сделать что-либо", особенно, когда речь идет об обработке файлов. Но при изобилии доступных средств, возникает вопрос, какое из них лучше для выполнения работы. Конечно, в действительности, ответ на этот вопрос зависит от того, какие цели вы ставите при обработке файла, поэтому изучение всех возможностей языка стоит потраченного времени.

Традиционные методы fopen

Методы fopen , возможно, лучше других знакомы программистам C и C++ былых времен, поскольку в большей или меньшей степени являются именно теми инструментами, которые на протяжении долгих лет были всегда у вас под рукой, если вы работали с этими языками программирования. Для любого из этих методов вы выполняете стандартную процедуру, используя fopen для открытия файла, функцию для чтения данных, а затем fclose для закрытия файла, как показано в Листинге 1.

Листинг 1. Открытие и чтение файла с помощью fgets
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) { $line = fgets($file_handle); echo $line; } fclose($file_handle);

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

  1. Открываете файл. $file_handle хранит ссылку на сам файл.
  2. Проверяете, не достигли ли вы конца файла.
  3. Продолжаете считывание файла, пока не достигнете конца, печатая каждую строку, которую читаете.
  4. Закрываете файл.

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

Функция fopen

Функция fopen устанавливает связь с файлом. Я говорю "устанавливает связь, " поскольку, кроме открытия файла, fopen может открыть и URL:

$fh = fopen("http://127.0.0.1/", "r");

Это строка программы создает связь с вышеуказанной страницей и позволяет вам начать ее чтение как локального файла.

Примечание: Параметр "r" , использованный в fopen , указывает на то, что файл открыт только для чтения. Поскольку запись в файл не входит в круг вопросов, рассматриваемых в данной статье, я не стану перечислять все возможные значения параметра. Тем не менее, вам необходимо изменить "r" на "rb" если вы производите чтение из двоичных файлов для межплатформенной совместимости. Ниже будет приведен пример данного типа.

Функция feof

Команда feof определяет, произведено ли чтение до конца файла, и возвращает значение True (Истина) или False (Ложь). Цикл, приведенный в продолжается, пока не будет достигнут конец файла "myfile." Обратите внимание, что feof также возвращает False, если вы читаете URL и произошло превышение времени ожидания подключения, поскольку не имеется более данных для считывания.

Функция fclose

Пропустим середину Листинга 1 и перейдем в конец; fclose выполняет задачу, противоположную fopen: она закрывает подключение к файлу или URL. После выполнения данной функции вы больше не сможете выполнять чтение из файла или сокета.

Функция fgets

Возвращаясь на несколько строк назад в Листинге 1, вы попадаете в самый центр процесса обработки файлов: непосредственно чтение файла. Функция fgets - это выбранное вами "оружие" для первого примера. Она захватывает строчку данных из файла и возвращает ее как строку. Оттуда вы можете выводить данные или обрабатывать их иным образом. В примере, приведенном в Листинге 1, распечатывается весь файл целиком.

Если вы решите ограничить размер порции данных, с которой работаете, можно добавить fgets аргумент для ограничения максимальной длины строки захватываемых данных. Например, используйте следующий программный код для ограничения длины строки в 80 символов:

$string = fgets($file_handle, 81);

Вспомните "\0", указатель конца строки в C и установите длину на один символ больше, чем вам в действительности необходимо. Как видите, в приведенном выше примере используется 81, тогда как вам нужно 80 символов. Сделайте вашей привычкой добавление дополнительного символа всегда, когда вам понадобится задать ограничение длины строки для данной функции.

Функция fread

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

И здесь мы обращаемся к fread . Функция fread используется в несколько иных целях, чем fgets: она предназначена для чтения из двоичных файлов (то есть файлов, не состоящих изначально из текста, удобочитаемого для человека). Поскольку понятие "строк" не актуально для двоичных файлов (логические структуры данных обычно не разбиваются на строки), вы должны указывать количество байтов, которое нужно считывать.

$fh = fopen("myfile", "rb"); $data = fread($file_handle, 4096);

В приведенном выше примере считывается 4096 байтов (4 KB) данных. Обратите внимание, что, независимо от указанного вами значения, fread будет считывать не более 8192 байтов (8 KB).

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

$fh = fopen("myfile", "rb"); $data = fread($fh, filesize("myfile")); fclose($fh);

Если размер файла больше, вам придется использовать цикл для считывания оставшейся его части.

Функция fscanf

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

list ($field1, $field2, $field3) = fscanf($fh, "%s %s %s");

Строки форматирования, использованные в данной функции, описаны во многих источниках, таких как PHP.net, поэтому я не стану повторять эту информацию здесь. Достаточно сказать, что форматирование строк является очень гибким. Следует также упомянуть, что все поля помещаются в переменную, возвращаемую функцией. (В языке C они передавались бы как аргументы.)

Функция fgetss

Функция fgetss отличается от традиционных функций для работы с файлами и дает вам лучшее представление о возможностях PHP. Она работает наподобие fgets , но отбрасывает любые обнаруженные ею теги HTML или PHP, оставляя только "голый" текст. Возьмем приведенный ниже HTML-файл.

Листинг 2. Пример файла HTML
My title

If you understand what "Cause there ain"t no one for to give you no pain" means then you listen to too much of the band America

Пропустим его через функцию fgetss .

Листинг 3. Использование fgetss
$file_handle = fopen("myfile", "r"); while (!feof($file_handle)) { echo = fgetss($file_handle); } fclose($file_handle);

Вот что вы получите в качестве выходных данных:

My title If you understand what "Cause there ain"t no one for to give you no pain" means then you listen to too much of the band America

Функция fpassthru

Вне зависимости от того, как вы считываете данные из файла, вы можете вывести оставшиеся данные на печать, используя стандартный канал вывода информации, посредством функции fpassthru .

fpassthru($fh);

Эта функция выводит данные на печать, поэтому вам не нужно помещать их в переменную.

Нелинейная обработка файла: перемещение по файлу

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

fseek($fh, 0);

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

fseek($fh, 1024);

Начиная с PHP V4.0, доступны также несколько других опций. Например, если нужно перейти вперед на 100 байт от вашей текущей позиции, вы можете использовать следующий код:

fseek($fh, 100, SEEK_CUR);

Аналогично, переход назад на 100 байт осуществляется посредством:

fseek($fh, -100, SEEK_CUR);

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

fseek($fh, -100, SEEK_END);

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

Примечание: вы не можете использовать fseek в дескрипторах файла, ссылающихся на URL.

Захват целого файла

Теперь мы переходим к рассмотрению некоторых уникальных возможностей PHP для обработки файлов: обработка больших блоков данных в одной или двух строках. Например, как можно захватить файл и вывести все его содержимое на вашу Web-страницу? Что же, вы видели пример использования цикла с fgets . Но как сделать это проще? Процесс почти смехотворно прост при использовании fgetcontents , которая помещает весь файл в строку.

$my_file = file_get_contents("myfilename"); echo $my_file;

Хотя это и не лучший вариант, вы можете записать эту команду еще короче:

echo file_get_contents("myfilename");

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

echo file_get_contents("http://127.0.0.1/");

Это команда фактически та же, что и:

$fh = fopen("http://127.0.0.1/", "r"); fpassthru($fh);

Должно быть, вы смотрите на эти примеры и думаете, "Это все-таки слишком трудоемкий способ". PHP-разработчики согласны с вами. Поэтому вы можете сократить приведенную выше команду до:

readfile("http://127.0.0.1/");

Функция readfile передает на вывод все содержимое файла или Web-страницы в выходной буфер по умолчанию. По умолчанию эта команда выводит сообщение об ошибке при сбое. Во избежание такого поведения (если вы этого хотите), попробуйте команду:

@readfile("http://127.0.0.1/");

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

$array = split("\n", file_get_contents("myfile"));

Но к чему вам все эти сложности, если есть идеально подходящая функция, которая сделает за вас эту работу? Функция PHP file() выполняет эту задачу в один шаг: она возвращает строковый массив, элементами которого являются строки файла.

$array = file("myfile");

Следует заметить, что между двумя приведенными выше примерами есть небольшое отличие. Команда split удаляет знаки перехода на новую строку, тогда как при использовании команды file строки массива оканчиваются знаками перехода на новую строку (также, как и при использовании fgets).

Возможности PHP, тем не менее, далеко превосходят описанные выше. Вы можете разбить целые.ini-файлы в стиле PHP всего одной командой parse_ini_file . Команда parse_ini_file применима к файлам, сходным с приведенным в Листинге 4.

Листинг 4. Пример файла.ini
; Comment name = "King Arthur" quest = To seek the holy grail favorite color = Blue Samuel Clemens = Mark Twain Caryn Johnson = Whoopi Goldberg

Следующие команды представляют файл в виде массива, а затем выводят этот массив на печать:

$file_array = parse_ini_file("holy_grail.ini"); print_r $file_array;

В результате будут получены следующие выходные данные:

Листинг 5. Выходные данные
Array ( => King Arthur => To seek the Holy Grail => Blue => Mark Twain => Whoopi Goldberg)

Конечно, вы можете заметить, что данная команда объединила разделы. Это действие по умолчанию, но вы легко можете произвести необходимую настройку, воспользовавшись вторым аргументом parse_ini_file: process_sections , который является переменной логического типа (Boolean). Установите значение process_sections как True (истина).

$file_array = parse_ini_file("holy_grail.ini", true); print_r $file_array;

И ваши выходные данные будут иметь вид:

Листинг 6. Выходные данные
Array ( => Array ( => King Arthur => To seek the Holy Grail => Blue) => Array ( => Mark Twain => Whoopi Goldberg))

PHP помещает данные в легко разбиваемый для анализа многомерный массив.

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

Хороший стиль программирования

Никогда не считайте, что все в вашей программе будет работать так, как было задумано. Например: что, если файл, который вы ищете, был перемещен? Что, если в результате изменения прав доступа вы не можете прочитать содержимое файла? Можно заранее проверить наличие файла и права на его чтение, воспользовавшись методами file_exists и is_readable .

Листинг 7. Использование file_exists и is_readable
$filename = "myfile"; if (file_exists($filename) && is_readable ($filename)) { $fh = fopen($filename, "r"); # Processing fclose($fh); }

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

if ($fh = fopen($filename, "r")) { # Processing fclose($fh); }

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

Как и fopen , функции file_get_contents , file и readfile возвращают значение False, если не удается открыть или обработать файл. Функции fgets , fgetss , fread , fscanf и fclose также возвращают значение False при возникновении ошибки. Конечно, за исключением fclose , вы, вероятно уже обработали возвращенные ими результаты. Что касается fclose , мало что можно сделать, если дескриптор файла не закрывается должным образом, поэтому проверка возвращенного значения функции fclose , как правило, является излишней.

Выбор за вами

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

Если вы обрабатываете большие объемы данных, вероятно, fscanf окажется более полезной и эффективной, чем, скажем, использование file в сочетании с последующими командами split и sprintf . Если же вы просто отображаете текст большого объема с незначительными изменениями, напротив, использование функций file , file_get_contents , или readfile , возможно, будет более целесообразным. Это решение, вероятно, будет верным при использовании PHP для кэширования или даже создания временного прокси сервера.

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

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

Файлы php

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

Для работы с файлами php используются специальные приложения – программные редакторы. Наиболее распространенными из них являются:

  • Dreamweaver.
  • PHPEdit.
  • Eclipse PHP Development.


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

include имя_файла

Пример подключения:

Подключаемый файл:


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

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



Открытие и закрытие файлов

В php все операции с файлами осуществляются в несколько этапов:

  • Открытие файла;
  • Редактирование содержимого;
  • Закрытие файла.

Для открытия файла используется функция fopen() . Ее синтаксис:

int fopen(string filename, string mode [, int use_include_path])

Принимаемые аргументы:

  • string filename – имя файла или абсолютный путь к нему. Если путь к файлу не будет указан, то будет произведен его поиск в текущем каталоге. При отсутствии искомого файла система выведет сообщение об ошибке. Пример:


  • string mode – указывает режим открытия файла. Принимаемые аргументом значения:
  • r – файл открыт только для чтения, файловый указатель устанавливается в начале;
  • r+ – файл открыт для чтения и записи;
  • w – создается новый файл только для записи. Если файл с таким именем уже существует, в нем происходит автоматическое удаление всех данных;
  • w+ — создается новый файл для записи и чтения. При существовании такого файла происходит полная перезапись его данных на новые;
  • a – файл открыт для записи. Указатель устанавливается в конце. То есть запись в файл php начнется не с начала, а с конца;
  • a+ – открытие файла в режиме чтения и записи. Запись начнется с конца;
  • b – режим работы с файлом, содержащим в себе двоичные данные (в двоичной системе исчисления). Этот режим доступен только в операционной системе Windows.

Для закрытия доступа к файлу служит функция fclose () . Синтаксис:

int fclose (int file) , где int file – дескриптор сайта, который нужно закрыть.

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

Пример:

Чтение и запись файлов

Для простого отображения всего содержимого файла идеально подходит функция readfile () . Ее синтаксис:

readfile (string filename) , где string filename – строковое имя фала (не дескриптор ).


int fpassthru (int file)

Для работы с функцией требуется открытие и закрытие файла. Пример:

Результат аналогичен предыдущему.

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

  • string fgets (int file, int length) – функция считывает строку длиною length . Пример:


  • string fread (int file, int length) – по действию идентична предыдущей.

Для записи текстовых данных в файл существует две идентичные функции:

  • int fputs (int file, string string [, int length ])
  • int fwrite (int file, string string [, int length ])

Функции записывают в файл int file строку string string указанной длины int length (необязательный аргумент ). Пример:


Создание и удаление файлов

Чтобы создать файл php , можно использовать функцию fopen() в режиме доступа «w » или «w+ ». Или функцию touch () . Она устанавливает время изменения файла. При отсутствии элемента с искомым именем он будет создан. Ее синтаксис:

int touch (string filename [, int time [, int atime]])

Для создания копии файла используется функция copy() . В качестве аргументов она принимает имя оригинала и файла, куда нужно скопировать содержимое. Если он не существует, то будет создан. Синтаксис функции:

int copy (string file1, string file2)


Удалить файл можно с помощью функции unlink() . Ее синтаксис.

А сейчас будет достаточно большой, но не сложный урок о работе с файлами в php. Для начала, для чего нужны файлы? Ведь можно все хранить в базе данных MySQL или PostgreSQL или любой другой. Но иногда бывают такие задачи, когда использование БД, со всеми обработками и заботой о безопасности соединения, не целесообразно. Например нужно сделать обычный счетчик, а до этого в проекте у нас БД не использовалась. Так что нам, ради одного малюсенького счетчика заводить базу данных и хранить в ней всего пару строк? тут гораздо проще воспользоваться файлами. К тому же, иногда на хостинге вообще нет поддержки баз данных, тогда файлы вообще остаются единственным выходом.

Ну, допустим я вас убедил, что файлы необходимы:) Теперь давайте разбираться, как же с ними работать. Как создавать, открывать, записывать, перезаписывать, читать и так далее. Обо всем по порядку.

Создаем файл

В PHP для открытия файлов используется функция fopen. Тем не менее, она также может и создавать файлы. Если передать fopen имя файла, которого не существует, то она создаст его.

Сама функция fopen принимает два параметра, оба они обязательны. Во-первых, мы должны указать имя файла, который хотим открыть. Во-вторых, передать параметр, который объясняет функции, что мы планируем делать с этим файлом (например, чтение из файла, запись и так далее).

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

Пример:

$ourFileName = "testFile.txt";

$ourFileHandle = fopen($ourFileName, "w") or die("can"t open file");

fclose($ourFileHandle);

Первая строчка $ourFileName = testFile.txt создает строковую переменную, в которой мы будем хранить имя файла.

Вторая строчка $ourFileHandle = fopen($ourFileName, ‘w’) or die(«can’t open file») соответственно создает или открывает уже существующий файл на запись. Или же возвращает сообщение, что не может открыть файл.

Третья строчка fclose($ourFileHandle) закрывает файл. На самом деле все просто.

Параметры открытия файла в php

Первый параметр ‘r’ (read) — открывает файл только на чтение, записывать в него будет нельзя.

Второй параметр ‘w’ (write) — открывает для записи. При этом всегда запись будет идти с начала файла. Если там уже есть какая то информация — то она будет перезаписана.

Третий параметр ‘a’ (append) — открывает файл на запись, но при этом будет дописывать в конец файла, в отличие от w.

Расширенные параметры:

Параметр ‘r+’ — открывает и на чтение и на запись. Указатель будет в начале файла.

Параметр ‘w+’ — открывает и на чтение и на запись, НО удаляет всю информацию, которая была в файле!!!

араметр ‘a+’ — открывает на чтение и запись, но указатель будет в конце файла.

Естественно, что функции можно передать только один из этих параметров, а не несколько. Их нужно подставлять вместо ‘X":

fopen($ourFileName, "X")

Запись в файл

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

$myFile = "testFile.txt";

$fh = fopen($myFile, "w") or die("can"t open file");

$stringData = "Первая строчкаn";

fwrite($fh, $stringData);

$stringData = "Вторая строчкаn";

fwrite($fh, $stringData);

Создали файл testFile.txt, указатель на него хранится в переменной $fn. Записали в него строчку «Первая строчка» (в конце применили символ конца строки n), а затем и «Вторая строчка». После чего закрыли файл.

ВНИМАНИЕ! Никогда не забывайте закрывать ваши файлы! Иначе в случае аварийного завершения выполнения скрипта — данные в файлах не сохранятся! Всегда после работы используйте fclose!!!

Чтение из файла

Записать записали, теперь давайте прочитаем! Это тоже не так сложно. Используем функцию fread. На вход ей подаем указатель на файл и количество байт, которое хотим прочитать. Например, один символ равен одному байту (зависит от кодировки), мы хотим прочитать 5 символов: $theData = fread($fh, 5).

Но если нужно получить всю информацию, которая есть в файле, то тут нам понадобится функция filesize, которая возвращает количество байт в файле, следовательно, если результат функции filesize передать в fread, то мы получим полностью всю информацию из файла:

$myFile = "testFile.txt";

$fh = fopen($myFile, "r");

$theData = fread($fh, filesize($myFile));

Надеюсь понятно объяснил.

$myFile = "testFile.txt";

$fh = fopen($myFile, "r");

$theData = fgets($fh);

В результате получим первую строчку из файла testFile.txt. Соответственно, чтобы пройтись по всем строчкам нужно использовать цикл foreach:

$lines = file("testFile.txt");

foreach($lines as $single_line)

echo $single_line . "
n";

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




Top