Файловая система PHP

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

Открытие файла с помощью функции PHP fopen()

Для работы с файлом сначала нужно его открыть функцией fopen(). Ее синтаксис:

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

Первый параметр, передаваемый в fopen(), это имя файла, который нужно открыть, а второй — режим открытия. Например:

<?php
$handle = fopen("data.txt", "r");
?>

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

Режим Что он делает
R Открывает файл только для чтения.
r+ Открывает файл для чтения и записи.
W Открывает файл только для записи и очищает содержимое файла. Если файл не существует, PHP попытается его создать.
w+ Открывает файл для чтения и записи и очищает содержимое файла. Если файл не существует, PHP попытается его создать.
A Открывает файл только для записи. Сохраняет содержимое файла, записывая его в конец файла. Если файл не существует, PHP попытается его создать.
a+ Открывает файл для чтения и записи. Сохраняет содержимое файла, записывая его в конец файла. Если файл не существует, он будет создан. Можно использовать вместо PHP fread ()
X Открывает файл только для записи. Возвращает значение FALSE и генерирует ошибку, если файл уже существует. Если файл не существует, PHP попытается его создать.
x+ Открывает файл для чтения и записи; в противном случае имеет такое же поведение, как «x».

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

<?php
$file = "data.txt";

// Проверяем наличие файла
if(file_exists($file)){
    // Пытаемся открыть файл
    $handle = fopen($file, "r");
} else{
  echo "ERROR: File does not exist.";
}
?>

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

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

Как только вы закончите чтение файла с помощью PHP fread, его нужно закрыть. Для этого используется функция fclose():

<?php
$file = "data.txt";

// Проверяем наличие файла
if(file_exists($file)){
    // Открываем файл для чтения
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");

    /* Некоторый выполняемый код */

    // Обработка закрытия файла
    fclose($handle);
} else{
    echo "ERROR: File does not exist.";
}
?>

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

Чтение из файлов с помощью функции PHP fread()

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

Чтение фиксированного количества символов

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

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

Она принимает два параметра — дескриптор файла и количество байтов, которые должны быть считаны. В следующем примере мы считываем 20 байтов из файла data.txt, включая пробелы. Предположим, data.txt содержит абзац текста «The quick brown fox jumps over the lazy dog«:

<?php
$file = "data.txt";

// Проверяем наличие файла
if(file_exists($file)){
    // Открываем файл для чтения
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");

    // Считываем фиксированное количество байтов из файла
    $content = fread($handle, "20");

    // Обработка закрытия файла
    fclose($handle);

    // Выводим содержимое файла 
    echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

Приведенный выше пример даст следующий результат:

The quick brown fox

Чтение всего содержимого файла

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

<?php
$file = "data.txt";

// Проверяем наличие файла
if(file_exists($file)){
    // Открываем файл для чтения
    $handle = fopen($file, "r") or die("ERROR: Cannot open the file.");

    // Считываем весь файл
    $content = fread($handle, filesize($file));

    // Обработка закрытия файла
    fclose($handle);

    // Выводим содержимое файла
    echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

Приведенный выше пример даст следующий результат:

The quick brown fox jumps over the lazy dog.

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

<?php
$file = "data.txt";

// Проверяем наличие файла
if(file_exists($file)){
    // Считывает и выводит весь файл
    readfile($file) or die("ERROR: Cannot open the file.");
} else{
    echo "ERROR: File does not exist.";
}
?>

Приведенный выше пример даст следующий результат:

The quick brown fox jumps over the lazy dog.

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

<?php
$file = "data.txt";

// Проверяем наличие файла
if(file_exists($file)){
    // Считываем весь файл в строку
    $content = file_get_contents($file) or die("ERROR: Cannot open the file.");

    // Выводим содержимое файла
    echo $content;
} else{
    echo "ERROR: File does not exist.";
}
?>

Еще один способ считывания всех данных из файла — это функция file(). Она работает аналогично функции file_get_contents(), но возвращает содержимое как массив строк, а не одну строку. Каждый элемент возвращаемого массива соответствует строке в файле.

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

<?php
$file = "data.txt";

// Проверяем наличие файла
if(file_exists($file)){
    // Считываем весь файл в массив
    $arr = file($file) or die("ERROR: Cannot open the file.");
    foreach($arr as $line){
        echo $line;
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

Запись файлов с использованием функции PHP fwrite()

Можно записать данные в файл с помощью функции PHP fwrite(). Ее синтаксис:

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

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

<?php
$file = "note.txt";

// Строка данных, которую нужно записать
$data = "The quick brown fox jumps over the lazy dog.";

// Открываем файл для записи
$handle = fopen($file, "w") or die("ERROR: Cannot open the file.");

// Записываем данные в файл
fwrite($handle, $data) or die ("ERROR: Cannot write the file.");

// Обработка закрытия файла
fclose($handle);

echo "Data written to the file successfully.";
?>

В приведенном выше примере, если файл note.txt не существует, PHP автоматически создаст его и запишет данные. Но если note.txt уже существует, PHP перед записью новых данных стирает содержимое этого файла. Если вы просто хотите добавить файл и сохранить существующее содержимое, используйте режим a вместо w.

Альтернативный способ – file_put_contents(). Это аналог функции file_get_contents(), который предоставляет простой способ записи данных в файл без необходимости его открытия. Эта функция принимает имя и путь к файлу с данными, которые должны быть записаны. Например (похожий на PHP fread пример):

<?php
$file = "note.txt";

// Строка данных, которые нужно записать
$data = "The quick brown fox jumps over the lazy dog.";

// Записываем данные в файл
file_put_contents($file, $data) or die("ERROR: Cannot write the file.");

echo "Data written to the file successfully.";
?>

Если файл, указанный в функции file_put_contents(), уже существует, PHP по умолчанию перезапишет его. Если вы хотите сохранить содержимое файла, можно передать специальный флаг FILE_APPEND в качестве третьего параметра file_put_contents(). Тогда функция добавит новые данные в файл, а не перепишет их. Пример:

<?php
$file = "note.txt";

// Строка данных, которую нужно записать
$data = "The quick brown fox jumps over the lazy dog.";

// Записываем данные в файл
file_put_contents($file, $data, FILE_APPEND) or die("ERROR: Cannot write the file.");

echo "Data written to the file successfully.";
?>

Переименование файлов с помощью функции PHP rename()

После прочтения с помощью php fread() файл можно переименовать файл или каталог, используя функцию PHP rename(), например:

<?php
$file = "file.txt";

// Проверяем наличие файда
if(file_exists($file)){
    // Пытаемся переименовать файл
    if(rename($file, "newfile.txt")){
        echo "File renamed successfully.";
    } else{
        echo "ERROR: File cannot be renamed.";
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

Удаление файлов с помощью функции PHP unlink()

Можно удалять файлы или папки с помощью функции PHP unlink(), например:

<?php
$file = "note.txt";

// Проверяем наличие файла
if(file_exists($file)){
    // Попытка переименования файла
    if(unlink($file)){
        echo "File removed successfully.";
    } else{
        echo "ERROR: File cannot be removed.";
    }
} else{
    echo "ERROR: File does not exist.";
}
?>

Функции файловой системы PHP

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

Функция Описание
fgetc() Считывает один символ за раз.
fgets() Считывает одну строку за раз.
fgetcsv() Считывает строку разделенных запятыми значений.
filetype() Возвращает тип файла.
feof() Проверяет, достигнут ли конец файла.
is_file() Проверяет, является ли файл стандартным файлом.
is_dir() Проверяет, является ли файл каталогом.
is_executable() Проверяет, является ли файл исполняемым.
realpath() Возвращает канонизированный абсолютный путь к файлу.
rmdir() Удаляет пустую директорию.

Перевод статьи «PHP File System» дружной командой проекта Сайтостроение от А до Я.