ресурс для начинающих веб-разработчиков
комплексные веб-услуги по созданию сайтов

Справочный материал по основным языкам программирования и верстки сайтов.

Готовая методика создания простых и сложных динамичных сайтов, с использованием PHP и MySQL.

Использование веб-редактора Adobe Dreamweaver в разработке сайтов.

Использование графических редакторов Adobe Flash, Adobe Photoshop, Adobe Fireworks в подготовке веб-графики.

Разработка веб-сайтов под "ключ".

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

Работа с файлами PHP. Открытие, отображение, запись и закрытие файлов

Файлы

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

Запись и считывание данных из файла производится в три этапа:

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

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

Для открытия файла в среде РНР используется функция

fopen(имя_файла, режим_файла)

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

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

Режим Описание
r Файл открывается только для чтения. Если файла не существует, вызов регистрирует ошибку. После удачного открытия указатель файла устанавливается на его начало;
r+ Файл открывается одновременно на чтение и запись. Указатель текущей позиции устанавливается на его начало. Как и для режима r , если файла не существует, возвращается false . Следует отметить, что если в момент записи указатель файла установлен где-то в середине файла, то данные запишутся прямо поверх уже имеющихся, а не "раздвинут" их, при необходимости увеличив размер файла. Будьте внимательны;
w Открывает файл только для записи и помещает указатель в начало файла. Если файл не существует создает новый пустой файл. Если на момент вызова уже был файл с таким именем, то он предварительно уничтожается. В случае неверно заданного имени файла вызов, как нетрудно догадаться, "проваливается";
w+ Аналогичен r+ открывает файл только для записи и помещает указатель в начало файла, но если файла изначально не существовало, создает его. После этого с файлом можно работать как в режиме чтения, так и записи. Если файл существовал до момента вызова, его содержимое удаляется;
a Открывает существующий файл только для записи, и при этом сдвигает указатель текущей позиции за последний байт файла. Этот режим полезен, если требуется что-то дописать в конец уже имеющегося файла. Как водится, вызов неуспешен в случае отсутствия файла;
a+ Открывает файл для чтения и записи, указатель файла устанавливается на конец файла, при этом содержимое файла не уничтожается. Отличается от a тем, что если файла изначально не существовало, то он создается. Этот режим полезен, если вам нужно что-то дописать в файл (например, в журнал), но вы не знаете, создан ли уже такой файл;

x Создает и открывет файл только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей. Если файл не существует попытается его создать.
x+ Создает и открывет файл для чтения и записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей. Если файл не существует попытается его создать.

При работе в операционной системе Windows также можно явно указать, содержит ли файл двоичные (b) или текстовые (t) данные. В этом случае следует добавить "b" или "t" к строке режима. Если вы записываете текстовые данные в файл Windows и укажите режим "a+t", то строки будут разделяться символами \n\r, как и положено Windows.

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

Пример:

<?php
$fl=fopen("170.php", "r"); //возвращает Resource id #3
if(!$fl)
{
echo "Ошибка при открытии файла";
}
echo $fl;
?>

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

<?php
$fl=fopen("images/foto15.gif", "rb"); //возвращает дескриптор Resource id #3
if(!$fl)
{
echo "Ошибка открытия файла";
}
echo $fl;
?>

Конструкция or die

Давайте изменим приведенные выше скрипты:

<?php
// открываем файлы на чтение
$fl=fopen("170.php", "r") or die("Ошибка!");
echo $fl. "<br>";
$fl=@fopen("images/fot15.gif", "rb") or die("Ошибка!");
echo $fl;
?>

В приведенном примере обратите внимание на конструкцию or die(). Ее особенно удобно применять при работе с файлами. Оператор or аналогичен ||, но имеет очень низкий приоритет(даже ниже чем у =), поэтому в нашем примере всегда выполняется уже после присваивания.

То, что or обозначает логическое ИЛИ в нашем случае не так интересно(ибо возвращаемое значение просто игнорируется). Нас же интересует другое свойство оператора: выполнить второй операнд только в случае ложности первого. Если файл открыть не удалось fopen() возвращает false, а значит осуществляется вызов die() на другом конце оператора or.

Отображение файлов

Содержимое открытого файла можно отобразить в браузере с помощью функции

fpassthru(дескриптор_файла)

Пример:

<?php
$fl=fopen("phpstage2.html", "rb"); //возвращает дескриптор Resource id #3
if(!$fl)
{
echo "Ошибка открытия файла";
}
else
{
fpassthru($fl); //возвращает phpstage2.html
}
?>

Для текстовых файлов существует еще одна функция отображения

readfile(имя_файла)

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

Пример:

<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>Отображение файлов</title>
</head>

<body>
<?php
readfile("../../javascript/test/239.html");
?>
</body>
</html>

В окне веб-браузера это будет выглядеть ТАК.

Запись в файлы

Запись в файлы осуществляется функциями fputs() и fwrite(), которые абсолютно идентичны.

fputs(дескриптор_файла, строка[, количество_ символов])
fwrite(дескриптор_файла, строка[, количество_ символов])

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

Функция возвращает количество записанных байтов или false в случае ошибки.

Пример:

<?php
//открываем файл для чтения
$fd=fopen("file.txt","r");
//записываем файл
fwrite($fd, "Привет, всем!");
//закрываем файл
fclose($fd);
?>

Если необходимо записать содержимое файла в массив, применяется функция file():

array file(string filename [, int use_include_path]) — считывает файл с именем filename и возвращает массив, каждый элемент которого соответствует строке в прочитанном файле. В приведенном ниже примере с помощью функции читается файл, информация из которого затем выводится в браузер.

Использование функции file()
<?php
$content=file("file.txt");
foreach($content as $line) echo "$line <br>";
?>

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

Подсчет количества строк в файле
<?php
$content=file("file.txt");
echo count($content);
?>

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

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

fclose(дескриптор_файла)

Эта функция возвращает значение true в случае успешного закрытия файла и false, если файл не был закрыт.

Пример:

<?php
$fl=fopen("../../javascript/test/239.html", "w");
$t="Строка, которая будет записана в файл.\n";
$res=fwrite($fl, $t); // возвращает количество записанных байтов: 70
echo($res);
fclose($fl); //возвращает true
?>

В окне веб-браузера это будет выглядеть ТАК.

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

Прочитать строку из открытого файла можно с помощью функции

fread(дескриптор_файла, длина_строки)

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

Пример:

<?php
$fl=fopen("../../javascript/test/239.html", "r+");
$cont=fread($fl,38); //возвращает строку длиной 38 символов
echo($cont);
fclose($fl); //возвращает true
?>

В окне веб-браузера это будет выглядеть ТАК.

Для чтения из файла можно также пользоваться функцией

fgets(имя_файла, длина_строки)

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

Пример:

<?php
$fl=fopen("phpstage2.html", "r");
$cont=fgets($fl, 85); //возвращает строку
echo $cont;
fclose($fl); //возвращает true
?>

В результате выполнения этого сценария удастся прочитать только одну строку.

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

feof(дескриптор_файла)

Пример:

<?php
$fl=fopen("phpstage2.html", "r");
if(!$fl)
{
echo "<p>Ваш заказ не удается обработать сейчас </p>";
exit;
}
while(!feof($fl))
{
$cont=fgets($fl);
echo $cont;
}
fclose($fl);
?>

Кроме описанных выше базовых функций для работы с файлами, в РНР есть несколько функций, объединяющих действия, выполняемые базовыми функциями.

file_get_contents(имя_файла)

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

Пример:

<?php
echo file_get_contents("phpstage2.html");
?>

Копирование, переименование и удаление файлов

Копирование файлов осуществляется функцией

copy(файл1, файл2)

Функция копирует файл с именем файл1 в файл с именем файл2. Если файл файл2 на момент копирования существовал, то он перезаписывается.

<?php
copy("file1.php", "file2.php");
?>

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

rename(файл1, файл2)

Эта функция переименовывает файл с именем файл1 в файл с именем файл2. Функция rename() не выполняет переименования файла, если его новое имя расположено в другой файловой системе.

Пример:

<?php
rename("file2.php", "file1.php");
?>

Файл file2.php переименован в файл file1.php.

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

unlink(имя_файла)

Атрибуты файлов

  • file_exists(имя_файла) — проверяет, существует ли файл и возвращает true, если файл существует и false в противном случае.
  • fileatime(имя_файла) — возвращает время последнего обращения к файлу.
  • filemtime(имя_файла) — возвращает время последней модификации содержимого файла.
  • filesize(имя_файла) — возвращает размер файла в байтах.
  • filetype(имя_файла) — возвращает тип файла.

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

    • char (специальное символьное устройство);
    • dir (каталог);
    • fifo (именованный канал);
    • link (символическая ссылка);
    • block (специальное блочное устройство);
    • file (обычный файл);
    • unknown (тип не установлен).
  • Поскольку использование функций, возвращающих характеристики файла, весьма ресурсоемко, во избежание потери производительности при вызовах таких функций, PHP кэширует информацию о файле. Очистить этот кэш можно с помощью функции clearstatcache().

Работа с каталогами

Для установки текущего каталога применяется функция

chdir(директория)

Пример:

<?php
echo chdir("D:/sevidi/images/"); // возвращает true
?>

Чтобы узнать текущий каталог используется функция

getcwd(параметр_path)

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

mkdir(директория/каталог, код_доступа)

Эта функция создает каталог с именем каталог и правами доступа код_доступа. В случае неудачи возвращает false. Права доступа задаются только для каталогов UNIX, поскольку в Windows этот аргумент игнорируется.

<?php
$flag=mkdir("D:/site/test", 0700);
if($flag)
{
echo "Каталог успешно создан";
}
else
{
echo "Ошибка в создании каталога";
}
?>

Удалить каталог можно с помощью функции rmdir(директория/каталог).

Теперь удалим только что созданный каталог /test:

<?php
$flag=rmdir("D:/site/test");
if($flag)
{
echo "Каталог успешно удален";
}
else
{
echo "Ошибка удаления каталога";
}
?>

Блокировка файла

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

Применяются два вида блокировки:

  • блокировка чтения — этот общепринятый русский термин не передает смысла действия. Суть в том, что этот вид блокировки запрещает двум и более приложениям вести одновременную запись данных, но чтение файла несколькими приложениями одновременно в этом режиме разрешено;
  • блокировка записи означает введение режима, при котором чтение и запись разрешены только одному приложению.

Функция

flock(дескриптор_файла, код_режима)

осуществляет блокировку файла, идентификатор которого указан в ее первом параметре дескриптор_файла. Второй ее параметр код_режима содержит код режима блокировки.

Таблица. Допустимые значения второго параметра функции flock()
Значение Описание
1 Блокировка чтения
2 Блокировка записи
3 Снятие существующей блокировки
+4 Добавление 4 к текущему значению параметра предотвращает другие попытки блокирования во время выполнения текущего блокирования

Пример:

<?php
$fl=fopen("192.php", "w+");
flock($fl, 1);
?>