Работа с файлами в 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»