- Функция fopen в PHP, описание и примеры
- Параметры функции fopen
- Примеры использования функции fopen
- Работа с файлами в PHP
- Чтение файла: file()
- Создание файла и запись в файл: file_put_contents()
- Создание папки или структуры папок
- Проверка существования файла или папки
- Проверка прав доступа
- Копирование, перенос и удаление файла
- Работа с файлами с помощью fopen()
- Функция PHP «fopen»
- Режимы доступа
Функция fopen в PHP, описание и примеры
Функция fopen() закрепляет именованный ресурс за потоком, указанным в параметре $filename. В зависимости от того, как указан ресурс выбирает для него подключение и обработчик протокола для работы.
Если $filename определяется как локальный файл, будет выполняться открытие потока к этому файлу, если это позволяют права доступа.
function fopen($filename, $mode, $use_include_path = null, $context = null)
Параметры функции fopen
Режим открытия потока. Например, для чтения или записи. Может принимать следующие значения:
«r» — Открывает файл только для чтения.
«r+» — Открывает файл для чтения и записи.
«w» — Открывает файл только для записи. Стирает содержимое уже существующего файла, если он есть. Создает новый, если файла нет.
«w+» — Открывает файл для чтения и записи. Стирает содержимое уже существующего файла, если он есть. Создает новый, если файла нет.
«a» — Открывает файл для записи в конец файла. Создает новый, если файла нет.
«a+» — Открывает файл для чтения и записи в конец файла. Создает новый, если файла нет.
«x» — Создает и открывает файл только для записи, только если файла с указанным названием нет. Если файл уже есть, возвращает значение False.
«x+» — Создает и открывает файл для чтения и записи, только если файла с указанным названием нет. Если файл уже есть, возвращает значение False.
«c» — Открывает файл только для записи. Если файл существует, то перед тем как перезаписать его может быть выполнена проверка на блокировку.
«c+» — Открывает файл для чтения и записи. Если файл существует, то перед тем как перезаписать его может быть выполнена проверка на блокировку.
После указания режима, в параметре может быть еще значение «b» или «t», указывающее, как работать с файлом. Если указано «b», то выбран режим работы с бинарным файлом. Если «t», как с текстовым.
Примеры использования функции fopen
// открытие файла для создания и записи $f = fopen("myfile.txt", "w"); fwrite($f, "My text.\r\n"); fclose($f); // открытие файла для добавления $f = fopen("myfile.txt", "a"); fwrite($f, "New string.\r\n"); fclose($f); // открытие файла для чтения и записи $f = fopen("myfile.txt", "r+"); echo fgets($f); fwrite($f, "New string.\r\n"); fclose($f); // открытие для записи в режиме бинарного файла $f = fopen("img.gif", "wb"); // открытие потока для чтения из URL $f = fopen("http://www.mysite.ru/", "r");
Работа с файлами в PHP
С помощью функции file_get_contents() можно получить содержимое файла:
Также мы можем получить html-код какой-либо страницы в интернете:
'; echo file_get_contents('https://ya.ru'); echo '';
Но работает это далеко не для всех сайтов, у многих есть защита от такого примитивного парсинга.
Чтение файла: file()
Функция file() позволяет получить содержимое файла в виде массива. Разделителем элементов является символ переноса строки.
Создадим в корне сайта файл data.txt со следующим содержимым:
Теперь запустим скрипт index.php со следующим кодом:
При запуске этого скрипта мы получим в браузере:
array(3) < [0]=>string(7) "Vasya " [1]=> string(7) "Petya " [2]=> string(5) "Gosha" >
Заметили, что у первых двух строк длина 7 символов вместо пяти? Это из-за того, что каждая строка содержит в конце символы переноса строки.
Чаще всего они нам не нужны, поэтому их можно убрать, передав вторым параметром константу FILE_IGNORE_NEW_LINES :
Теперь у всех строк будет по 5 символов.
Если нам необходимо получить только заполненные строки в файле и пропустить пустые, можно передать вторым параметром константу FILE_SKIP_EMPTY_LINES :
Разумеется, мы можем передать сразу две константы:
Создание файла и запись в файл: file_put_contents()
Функция file_put_contents() позволяет создать файл и заполнить его данными.
Первым параметром функция принимает путь к файлу, вторым — строку с данными. Для создания пустого файла нужно передать вторым параметром пустую строку.
Если файла не существует — он будет создан. Если существует — данные в файле будут перезаписаны.
Чтобы не перезаписывать данные, а добавить их в конец файла, нужно передать третьим параметром константу FILE_APPEND :
Также вторым параметром можно передать массив:
Но этот вариант не очень удобен, поскольку все элементы массива запишутся подряд, без каких-либо разделителей. Чтобы их добавить, можно использовать функцию implode:
Создание папки или структуры папок
Создать папку можно с помощью функции mkdir() (make directory):
Вторым параметром указываются права доступа к файлу в виде восьмеричного числа, по-умолчанию это 0777 , что означает самые широкие права. Для Windows этот аргумент игнорируется.
Кроме этого, второй параметр может игнорироваться при заданной umask (пользовательская маска (user mask), которая нужна для определения конечных прав доступа). В этом случае принудительно сменить права можно функцией chmod() :
Также мы можем создать структуру папок рекурсивно, для этого нужно третьим параметром передать true :
Но в этом случае права доступа будут заданы только для конечной папки. Для изменения прав у каждой из папок придётся указывать права вручную:
Права доступа — это отдельная объёмная тема, поэтому сейчас мы её пока рассматривать не будем.
Проверка существования файла или папки
Проверить существование папки или файла можно с помощью функции file_exists() :
Если вы хотите проверить существование только папки или только файла, для этого есть специальные функции is_dir() и is_file() :
Проверка прав доступа
Функции is_readable() и is_writable() проверяют, есть ли у пользователя, от имени которого запущен PHP, права на чтение и запись файла или папки:
Копирование, перенос и удаление файла
Для удаления файлов используется функция unlink() :
Чтобы скопировать файл, используем функцию copy() :
Для переименования и переноса файла в другую папку используется функция rename() :
Работа с файлами с помощью fopen()
Функций file() , file_get_contents() и file_put_contents() достаточно для решения большинства задач, связанных с управлением файлами.
Но иногда возникают ситуации, когда нам необходимы более продвинутые инструменты. Например, если у нас есть большой текстовый файл и мы хотим читать его построчно, а не весь сразу, для экономии оперативной памяти.
Итак, открыть (или создать и открыть) файл можно с помощью функции fopen() :
Функция fopen() возвращает так называемый лескриптор. Это ссылка, указатель на файл, его мы будем передавать в другие функции. Кстати, тип данных этого дескриптора — resource .
Первым параметром мы передаём путь к файлу, вторым — модификатор доступа к файлу. Ниже перечислены наиболее популярные модификаторы:
- r — открытие для чтения, указатель переходит в начало файла.
- r+ — открытие для чтения и записи, указатель переходит в начало файла.
- w — открытие для записи, указатель переходит в начало файла. Если файла нет — создаётся, если есть — очищается от данных.
- w+ — открытие для чтения и записи, в остальном аналогичен w .
- a — открытие для записи, указатель переходит в конец файла. Если файла нет — создаётся.
- a+ — открытие для чтения и записи, в остальном аналогичен a .
- x — создание и открытие для записи, указатель переходит в начало файла. Если файл существует — PHP покажет ошибку.
- x+ — создание и открытие для чтения и записи, в остальном аналогичен x .
Указатель — это нечто вроде курсора. Вы можете переместить его в любое место файла, чтобы добавить или отредактировать определённые данные.
Для записи данных в файл существует функция fwrite() . Давайте попробуем создать файл и записать в него какие-нибудь данные:
Заметьте, из-за модификатора w при каждом запуске скрипта данные в файле стираются и добавляются заново. Если модификатор заменить на a , данные будут не перезаписываться, а добавляться в конец файла.
Для построчного чтения файла используется функция fgets() :
При каждом запуске fgets получает следующую строку и возвращает её в $line . Вторым параметром передаётся максимальная длина строки. Это означает, что если строка слишком длинная, она будет обрезана.
Также в PHP существует множество других полезных функций, работающих с дескриптором файла. Почитать о них можно в документации.
Функция PHP «fopen»
Как видно из примера, для того, чтобы функция смогла открыть или создать нужный файл, необходимо указать не только имя файла, но и путь его расположения. В этом случае может быть указано лишь имя файла, если он находится в той же папке, что и основной PHP-сценарий. Если же файл располагается в папке, расположенной на несколько уровней от текущей («files/data/info.txt») , необходимо также указать данный путь. Указание абсолютного пути к файлу («C:\\Home_server\\files\\info.txt») вполне допустимо, но необязательно. В этом случае, как вы уже заметили, наклонный разделитель удваивается, что обеспечивает более корректную работу функции.
Режимы доступа
Для функции fopen( ) существует четыре основные пары режимов доступа к файлам, которые определяют возможности их использования :
- r (режим чтения) и r+ (режим чтения и записи) — в обоих случаях позиция курсора в начале файла
- w (режим записи данных) и w+ (режим записи данных плюс чтение) — для обоих режимом при нахождении файла функция обнуляет его, а при отсутствии создает
- a (режим записи без обнуления файла) и a+ (режим записи и чтения без обнуления файла) — в данном случае позиция курсора в конце файла
- x (создание файла для записи) и x+ (создание файла для записи и чтения) — если файл уже существует, функция выдает ошибку
При использовании данных функций следует уделить внимание типу вашей операционной системы и версии PHP — от этого может существенно зависеть форма указания пути к файлу.
Читайте также о принципах работы с циклом PHP «foreach».
Благодарю за внимание! С уважением,
Николай Мурашкин, автор NikMurashkin.ru