Файл представляет собой последовательность байтов, хранящуюся на каком-либо физическом носителе информации. Каждый файл имеет абсолютный путь, по которому определяется его местонахождение. В качестве разделителя пути в 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;
?>
В окне веб-браузера это будет выглядеть ТАК.
Давайте изменим приведенные выше скрипты:
<?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(имя_файла)
Функция открывае файл, читает все его содержимое и выводит содержимое файла в окно браузера. В качестве аргумента эта функция принимает имя файла, а не его дескриптор.
Пример:
<?php
readfile("275.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("275.html", "w");
$t="Строка, которая будет записана в файл.\n";
$res=fwrite($fl, $t); // возвращает количество записанных байтов: 39
echo($res);
fclose($fl); //возвращает true
?>
В окне веб-браузера это будет выглядеть ТАК.
Прочитать строку из открытого файла можно с помощью функции
fread(дескриптор_файла, длина_строки)
Эта функция читает столько байтов из файла, сколько ей предписывает второй параметр длина_строки, если раньше не встретиться конец файла.
Пример:
<?php
$fl=fopen("310.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("180.php", "182.php");
?>
Переименование файла производится с помощью функции
rename(файл1, файл2)
Эта функция переименовывает файл с именем файл1 в файл с именем файл2. Функция rename() не выполняет переименования файла, если его новое имя расположено в другой файловой системе.
Пример:
<?php
rename("184.php", "183.php");
?>
Файл 184.php переименован в файл 183.php.
Удаление файла осуществляется посредством функции
unlink(имя_файла)
file_exists(имя_файла) — проверяет, существует ли файл и возвращает true, если файл существует и false в противном случае.
Пример:
В окне веб-браузера это будет выглядеть ТАК.
Строка, возвращаемая этой функцией, содержит один из следующих типов файла:
Пример:
<?php
echo filetype("184.php"); //возвращает file
?>
В окне веб-браузера это будет выглядеть ТАК.
Поскольку использование функций, возвращающих характеристики файла, весьма ресурсоемко, во избежание потери производительности при вызовах таких функций, PHP кэширует информацию о файле. Очистить этот кэш можно с помощью функции clearstatcache().
<?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);
?>