

Файл представляет собой последовательность байтов, хранящуюся на каком-либо физическом носителе информации. Каждый файл имеет абсолютный путь, по которому определяется его местонахождение. В качестве разделителя пути в 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);
        ?>
