Работаем с файлами на PHP


Оглавление (нажмите, чтобы открыть):

ГЛАВА 7 Файловый ввод/вывод и файловая система

Данная глава посвящена одному из важнейших аспектов PHP — средствам файлового ввода/вывода. Как нетрудно предположить, входные и выходные потоки данных интенсивно используются при разработке web-приложений. Не ограничиваясь простым чтением/записью файлов, PHP предоставляет в распоряжение программиста средства просмотра и модификации серверной информации, а также запуска внешних программ. Этим средствам и посвящена настоящая глава.

Проверка существования и размера файла

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

file_exists( ) и is_file( ).

Функция f ilе_ехists ( ) проверяет, существует ли заданный файл. Если файл существует, функция возвращает TRUE, в противном случае возвращается FALSE. Синтаксис функции file_exists( ):

bool file_exists(string файл)

Пример проверки существования файла:

if (! file_exists ($filename)) :

print «File $filename does not exist!»;

Функция is_file( ) проверяет существование заданного файла и возможность выполнения с ним операций чтения/записи. В сущности, is_file( ) представляет собой более надежную версию file_exists( ), которая проверяет не только факт существования файла, но и то, поддерживает ли он чтение и запись данных:

bool is_file(string файл)

Следующий пример показывает, как убедиться в существовании файла и возможности выполнения операций с ним:

print «The file $file is valid and exists!»;

print «The file $file does not exist or it is not a valid file!»;

Убедившись в том, что нужный файл существует и с ним можно выполнять различные операции чтения/записи, можно переходить к следующему шагу — открытию файла.

Функция filesize( ) возвращает размер (в байтах) файла с заданным именем или FALSE в случае ошибки. Синтаксис функции filesize( ):

int filesize(string имя_файла)

Предположим, вы хотите определить размер файла pastry.txt. Для получения нужной информации можно воспользоваться функцией filesize( ):

$fs = filesize(«pastry.txt»); print «Pastry.txt is $fs bytes.»;

Выводится следующий результат:

Pastry.txt is 179 bytes.

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

Открытие и закрытие файлов

Прежде чем выполнять операции ввода/вывода с файлом, необходимо открыть его функцией fopen( ).

Функция fopen( ) открывает файл (если он существует) и возвращает целое число — так называемый файловый манипулятор (file handle). Синтаксис функции fopen( ):

int fopen (string файл, string режим [, int включение_пути])

Открываемый файл может находиться в локальной файловой системе, существовать в виде стандартного потока ввода/вывода или представлять файл в удаленной системе, принимаемой средствами HTTP или FTP.

Параметр файл может задаваться в нескольких формах, перечисленных ниже:

Если параметр содержит имя локального файла, функция fopen( ) открывает этот файл и возвращает манипулятор.

Если параметр задан в виде php://stdin, php://stdout или php://stderr, открывается соответствующий стандартный поток ввода/вывода.

Если параметр начинается с префикса https://, функция открывает подключение HTTP к серверу и возвращает манипулятор для указанного файла.

Если параметр начинается с префикса ftp://, функция открывает подключение FTP к серверу и возвращает манипулятор для указанного файла. В этом случае следует обратить особое внимание на два обстоятельства: если сервер не поддерживает пассивный режим FTP, вызов fopen( ) завершается неудачей. Более того, FTP-файлы открываются либо для чтения, либо для записи.

При работе в пассивном режиме сервер ЯР ожидает подключения со стороны клиентов. При работе в активном режиме сервер сам устанавливает соединение с клиентом. По умолчанию обычно используется активный режим.

Параметр режим определяет возможность выполнения чтения и записи в файл. В табл. 7.1 перечислены некоторые значения, определяющие режим открытия файла.

Таблица 7.1. Режимы открытия файла

Режим Описание
Только чтение. Указатель текущей позиции устанавливается в начало файла
r+ Чтение и запись. Указатель текущей позиции устанавливается в начало файла
w Только запись. Указатель текущей позиции устанавливается в начало файла, а все содержимое файла уничтожается. Если файл не существует, функция пытается создать его
w+ Чтение и запись. Указатель текущей позиции устанавливается в начало файла, а все содержимое файла уничтожается. Если файл не существует, функция пытается создать его
a Только запись. Указатель текущей позиции устанавливается в конец файла. Если файл не существует, функция пытается создать его
a+ Чтение и запись. Указатель текущей позиции устанавливается в конец файла. Если файл не существует, функция пытается создать его

Если необязательный третий параметр включение_пути равен 1, то путь к файлу определяется по отношению к каталогу включаемых файлов, указанному в файле php.ini (см. главу 1).

Ниже приведен пример открытия файла функцией fopen( ). Вызов die( ), используемый в сочетании с fopen( ), обеспечивает вывод сообщения об ошибке в том случае, если открыть файл не удастся:

$file = «userdata.txt»; // Некоторый файл

$fh = fopen($file, «a+») or die(«File ($file) does not exist!»);

Следующий фрагмент открывает подключение к сайту PHP (https://www.php.net):

$site = «https://www.php.net»: // Сервер, доступный через HTTP

$sh = fopen($site., «r»); //Связать манипулятор с индексной страницей Php.net

После завершения работы файл всегда следует закрывать функцией fclose( ).

Функция fclose( ) закрывает файл с заданным манипулятором. При успешном закрытии возвращается TRUE, при неудаче — FALSE. Синтаксис функции fclose( ):

int fclose(int манипулятор)

Функция fclose( ) успешно закрывает только те файлы, которые были ранее открыты функциями fopen( ) или fsockopen( ). Пример закрытия файла:

$fh = fopen($file, «r»);

// Выполнить операции с файлом

print «File Sfile does not exist!»;

Запись в файл

С открытыми файлами выполняются две основные операции — чтение и запись.

Функция is_writeable( ) позволяет убедиться в том, что файл существует и для него разрешена операция записи. Возможность записи проверяется как для файла, так и для каталога. Синтаксис функции is_writeable( ):

bool is_writeable (string файл)

Одно важное обстоятельство: скорее всего, PHP будет работать под идентификатором пользователя, используемым web-сервером (как правило, «nobody»). Пример использования is_writeable( ) приведен в описании функции fwrite( ).

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

int fwrite(int манипулятор, string переменная [, int длина])

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

Функция fputs( ) является псевдонимом fwrite( ) и может использоваться всюду, где используется fwrite( ).

Функция fputs( ) является псевдонимом fwrite( ) и имеет точно такой же синтаксис. Синтаксис функции fputs( ):

int fputs(int манипулятор, string переменная [, int длина])

Лично я предпочитаю использовать fputs( ). Следует помнить, что это всего лишь вопрос стиля, никак не связанный с какими-либо различиями между двумя функциями.

Чтение из файла

Несомненно, чтение является самой главной операцией, выполняемой с файлами. Ниже описаны некоторые функции, повышающие эффективность чтения из файла. Синтаксис этих функций практически точно копирует синтаксис аналогичных функций записи.

Функция i s_readable( ) позволяет убедиться в том, что файл существует и для него разрешена операция чтения. Возможность чтения проверяется как для файла, так и для каталога. Синтаксис функции is_readable( ):

boo! is_readable (string файл]

Скорее всего, PHP будет работать под идентификатором пользователя, используемым web-сервером (как правило, «nobody»), поэтому для того чтобы функция is_readable( ) возвращала TRUE, чтение из файла должно быть разрешено всем желающим. Следующий пример показывает, как убедиться в том, что файл существует и доступен для чтения:

// Открыть файл и установить указатель текущей позиции в конец файла

$fh = fopen($filename, «r»);

print «$filename is not readable!»;

Функция fread( ) читает из файла, заданного файловым манипулятором, заданное количество байт. Синтаксис функции fwrite( ):

int fread(int манипулятор, int длина)

Манипулятор должен ссылаться на открытый файл, доступный для чтения (см. описание функции is_readable( )). Чтение прекращается после прочтения заданного количества байт или при достижении конца файла. Рассмотрим текстовый файл pastry.txt, приведенный в листинге 7.1. Чтение и вывод этого файла в браузере осуществляется следующим фрагментом:

$fh = fopen(‘pastry.txt’, «r») or die(«Can’t open file!»);

$file = fread($fh, filesize($fh));

Используя функцию fllesize( ) для определения размера pastry.txt в байтах, вы гарантируете, что функция fread( ) прочитает все содержимое файла.

Листинг 7.1. Текстовый файл pastry.txt

Recipe: Pastry Dough

1 1/4 cups all-purpose flour

3/4 stick (6 tablespoons) unsalted butter, chopped

2 tablespoons vegetable shortening 1/4 teaspoon salt

3 tablespoons water

Функция fgetc( ) возвращает строку, содержащую один символ из файла в текущей позиции указателя, или FALSE при достижении конца файла. Синтаксис функции fgetc( ):

string fgetc (int манипулятор)

Манипулятор должен ссылаться на открытый файл, доступный для чтения (см. описание функции is_readable( ) ранее в этой главе). В следующем примере продемонстрированы посимвольное чтение и вывод файла с использованием функции fgetc( ):

$fh = fopen(«pastry.txt», «r»); while (! feof($fh)) :

print $char; endwhile;

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

string fgets (int манипулятор, int длина)

Чтение прекращается при выполнении одного из следующих условий:

  • из файла прочитано длина — 1 байт;
  • из файла прочитан символ новой строки (включается в возвращаемую строку);
  • из файла прочитан признак конца файла (EOF).

Если вы хотите организовать построчное чтение файла, передайте во втором параметре значение, заведомо превышающее количество байт в строке. Пример построчного чтения и вывода файла:

$fh = fopen(«pastry.txt», «r»);

$line = fgets($fh, 4096);

Функция fgetss( ) полностью аналогична fgets( ) за одним исключением — она пытается удалять из прочитанного текста все теги HTML и PHP:

string fgetss (Int манипулятор, int длина [, string разрешенные_теги])

Прежде чем переходить к примерам, ознакомьтесь с содержимым листинга 7.2 — этот файл используется в листингах 7.3 и 7.4.

Листинг 7.2. Файл science.html

Breaking News — Science

Alien lifeform discovered

Early this morning, a strange new form of fungus was found growing in the closet of W. J. Gilmore’s old apartment refrigerator. It is not known if powerful radiation emanating from the tenant’s computer monitor aided in this evolution.

Работа с файлами и директориями в PHP

Набор PHP функций для работы с файлами и директориями, получение списка файлов в папке, безопасное сохранение файлов и т.д.

Получить имя файла из URL

Имя файла без расширения

Получить расширение файла

Размер файла

Чтобы получить размер файла применяется функция filesize($filename) , которая возвращает размер файла указанного в $filename в байтах.

Размер директории

Функция рекурсивно проходит по всем директориям и возвращает размер всех файлов в байтах.

Конвертация байтов в килобайты и мегабайты

Чтобы конвертировать байты в килобайты и мегабайты можно применить следующую функцию:

Получить список файлов директории в виде массива

То же самое делает функция scandir() , разница в том что у нее в массиве будут « . », « .. » и есть возможность сортировки.

Безопасное сохранение файла

Чтобы не затереть существующий файл на сервере можно применить данную функцию.

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

Работа с файловой системой

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

Чтение и запись файлов

Открытие и закрытие файлов

Для открытия файлов в PHP определена функция fopen() . Она имеет следующее определение: resource fopen(string $filename, string $mode) . Первый параметр $filename представляет путь к файлу, а второй — режим открытия. В зависимости от цели открытия и типа файла данный параметр может принимать следующие значения:

‘r’ : файл открывается только для чтения. Если файла не существует, возвращает false

‘r+’ : файл открывается только для чтения с возможностью записи. Если файла не существует, возвращает false

‘w’ : файл открывается для записи. Если такой файл уже существует, то он перезаписывается, если нет — то он создается

‘w+’ : файл открывается для записи с возможностью чтения. Если такой файл уже существует, то он перезаписывается, если нет — то он создается

‘a’ : файл открывается для записи. Если такой файл уже существует, то данные записываются в конец файла, а старые данные остаются. Если файл не существует, то он создается

‘a+’ : файл открывается для чтения и записи. Если файл уже существует, то данные дозаписываются в конец файла. Если файла нет, то он создается

Результатом функции fopen будет дескриптор файла. Этот дескриптор используется для операций с файлом и для его закрытия.

После окончания работы файл надо закрыть с помощью функции fclose() , которая принимает в качестве параметра дескриптор файла. Например, откроем и закроем файл:

Конструкция or die(«текст ошибки») позволяет прекратить работу скрипта и вывесте некоторое сообщение об ошибке, если функция fopen не смогла открыть файл.

Чтение файла

Для чтения файла можно использовать несколько функций. Для построчного чтения используется функция fgets() , которая получает дескриптор файла и возвращает одну считанную строку. Пройдем построчно по всему файлу:

При каждом вызове fgets() PHP будет помещать указатель в конец считанной строки. Чтобы проследить окончание файла, используется функция feof() , которая возвращает true при завершении файла. И пока не будет достигнут конец файла, мы можем применять функцию fgets().

Чтение файла полностью

Если нам надо прочитать файл полностью, то мы можем облегчить себе жизнь, применив функцию file_get_contents() :

При этом нам не надо открывать явно файл, получать дескриптор, а затем закрывать файл.

Поблочное считывание

Также можно провести поблочное считывание, то есть считывать определенное количество байт из файла с помощью функции fread() :

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

Запись файла

Для записи файла применяется функция fwrite() , которая записывает в файл строку:

Аналогично работает другая функция fputs() :

Работа с указателем файла

При открытии файла для чтения или записи в режиме ‘w’, указатель в файле помещается в начало. При считывании данных PHP перемещает указатель в файле в конец блока считанных данных. Однако мы также вручную можем управлять указателем в файле и устанавливать его в произвольное место. Для этого надо использовать функцию fseek, которая имеет следующее формальное определение:

Параметр $handle представляет дескриптор файла. Параметр $offset — смещение в байтах относительно начала файла, с которого начнется считывание/запись. Третий необязательный параметр задает способ установки смещения. Он может принимать три значения:

SEEK_SET : значение по умолчанию, устанавливает смещение в offset байт относительно начала файла

SEEK_CUR : устанавливает смещение в offset байт относительно начала текущей позиции в файле

SEEK_END : устанавливает смещение в offset байт от конца файла

В случае удачной установки указателя функция fseek() возвращает 0, а при неудачной установке возвращает -1.

Работа с файловой системой

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

Функции чтения и записи файлов

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

Любой сеанс манипулирования файлом может состоять из описанных ниже шагов:

Открыть файл для чтения-записи.

Выполнить операцию чтения в файле.

Провести необходимые операции с содержимым файла.

Записать результаты в файл (если нужно).

Для выполнения каждого из этих шагов предусмотрена соответствующая функция работы с файловой системой языка PHP.

Операция открытия файла

Для открытия файлов используется функция fopen(). Результат выполнения функции fopen() необходимо присваивать переменной. Следует учитывать, что функция fopen() в результате успешного выполнения возвращает не целое число, а строку, в которой приведены данные «Resource id #n», где n — номер открытого в настоящее время потока. Не следует пытаться проконтролировать успешное выполнение операции открытия файла с помощью вызовов функции is_int() или is_numeric(). Вместо этого следует использовать функцию die().

Если операция открытия файла прошла успешно, интерпретатор PHP возвращает идентификатор ресурса, который требуется для осуществления дальнейших операций, таких как fread или fwrite. В противном случае будет получено значение false.

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

Режим только чтения («r»).

Режим чтения и записи, применяемый, если файл уже существует («r+»). Запись осуществляется в начало файла; а если файл считывается как строка, после чего эта строка редактируется и снова выводится в файл, то фактически происходит запись обновленного файла с сохранением его первоначального содержимого.

Режим только записи («w»), в котором перед выполнением каких-либо операций записи создается файл с указанным именем, если этот файл еще не существует, и стирается содержимое указанного файла, если он существует! Данный режим не может использоваться для чтения файла; он предназначен только для записи.

Режим записи и чтения, применяемый, даже если файл еще не существует («w+»), предусматривает создание файла с указанным именем (при условии, что он не существует) и удаление до начала выполнения операций записи содержимого указанного файла!

Режим только записи, применяемый для дополнения файла, независимо от того, существует ли файл или нет («a»).

Режим записи и чтения, применяемый для дополнения файла, независимо от того, существует ли файл или нет («а+»). Если файл считывается как строка, после чего эта строка редактируется и снова выводится в файл, то фактически происходит запись обновленного файла с сохранением первоначального содержимого файла.

Необходимо тщательно следить за тем, чтобы содержимое любого существующего файла было считано заранее, если предусматривается модификация и повторная запись этого содержимого в режиме w или w+, поскольку в противном случае может произойти потеря данных. А при использовании других режимов вероятность потери данных намного меньше.

Для работы с файлами предусмотрена возможность открывать несколько типов соединений и использовать средства доступа, включая HTTP, HTTPS, FTP, FTPS, стандартный ввод-вывод, и др.

При использовании функции fopen() для работы по протоколу HTTP предпринимается попытка открыть соединение по протоколу HTTP 1.0 для обработки файла такого типа, который обычно обрабатывается веб-сервером (таким как файл HTML, PHP, ASP и т.д.). По существу, интерпретатор PHP вынуждает веб-сервер действовать так, как будто переданный ему запрос поступил из обычного веб-браузера, применяемого для просмотра Интернета, а не был получен с помощью операции открытия файла:

Следует помнить, что с формальной точки зрения URL без заключительного символа косой черты рассматривается как имеющий неправильную структуру, но в большинстве веб-серверов при получении параметра адреса, не соответствующего этому требованию, автоматически осуществляется замена URL такой же строкой с заключительным символом косой черты и предпринимается попытка перенаправить запрос по полученному адресу.

При использовании функции fopen() для работы по протоколу FTP предпринимается попытка установить соединение FTP с удаленным сервером от имени FTP-клиента. Этот вариант применения функции fopen() является более сложным, поскольку в данном случае, кроме имени хоста и пути к файлу, приходится также указывать имя пользователя и пароль FTP, как показано ниже:

Этот способ доступа осуществляется успешно только при условии, что используемый FTP-сервер поддерживает пассивный режим. Кроме того, открытие файла FTP может осуществляться только для чтения или записи, но не для выполнения той и другой операции, а операции записи должны использоваться только для создания новых файлов, а не для дополнения существующих.

Наиболее широко применяемый и удобный способ использования функции fopen() состоит в том, что эта функция служит для доступа к файлам из файловой системы. Поэтому интерпретатор PHP, если явно не указано иное, при вызове этой функции предпринимает попытки открыть файл, находящийся в файловой системе.

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

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

Операции чтения файла

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


При использовании указанной конструкции часто возникает ошибка, состоящая в том, что применяется вызов filesize($fd), а не filesize($filename).

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

Начиная с версии PHP 4.3.0 пользователям предоставлен доступ к новой функции — file_get_contents(). Эта функция возвращает все содержимое файла в виде строки и обладает возможностями функции fopen(). Применение функции file_get_contents() равносильно применению функций fopen() и fread().

Если требуется и выполнять чтение, и применять к файлу операции построчной обработки, то вместо функции fread() можно использовать функцию fgets(). Начиная с версии PHP 4.2.0 по умолчанию предусмотрено, что функция возвращает по 1024 байта в расчете на каждую строку, если в качестве второго параметра функции fgets() не задана длина строки.

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

Операции записи файла

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

Функция fputs() полностью идентична функции fwrite(), но fputs() имеет имя в стиле функций языка C.

Следует помнить, что открытие файла в режиме w или w+ приводит к полному и окончательному уничтожению всего содержимого файла. Указанные режимы предназначены только для перезаписи файлов, очищенных от прежнего содержимого. Если же требуется обеспечить запись в начале или в конце файла, то следует использовать соответственно режим r+ или a+.

Операции закрытия файла

Операция закрытия файла является несложной:

В отличие от функции fopen() результат выполнения функции fclose() не требуется присваивать переменной. На первый взгляд может показаться, что применение в сценарии операций закрытия файла является для программиста пустой тратой времени, но количество применимых дескрипторов файлов в системе ограничено, поэтому существует вероятность того, что доступные дескрипторы файлов будут исчерпаны, если ненужные файлы останутся открытыми. С другой стороны, интерпретатор PHP закрывает все открытые файлы после завершения сценария.

Ниже показан полный пример чтения и записи файла из текущей файловой системы:

Код PHP ‘; fclose($fd); echo ‘Запись в файл

‘; $fd = fopen($filename, «w+») or die(«Файл нельзя открыть»); fwrite ($fd, ‘Hello, world!’); fclose($fd);

Чтение из файла

В данном случае происходит чтение текущего файла, в котором выполняется скрипт и вывод его на экран. Затем выполняется операция записи с флагом w+ (файл перезаписывается), чтобы убедиться в этом достаточно просто обновить страницу:

Функция feof

Функция feof принимает в качестве параметра дескриптор файла и проверяет, не достигнут ли конец указанного файла. В основном эта функция используется в цикле while, в котором применяются аналогичные операции обработки к каждой строке файла, как в следующем примере:

Функция file_exists

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

Функция возвращает значение true, если файл существует, а если файл не найден, возвращает значение false. Результаты проверки сохраняются в кэше, который может быть очищен с помощью функции clearstatcache().

PHP — функции для работы с файлами и ввод-вывод

Дата публикации: 2020-10-20

От автора: в этой статье мы опишем следующие PHP функции работы с файлами: открытие файла, чтение файла, запись файла и закрытие файла.

Открытие и закрытие файлов

Для открытия файла используется функция PHP fopen(). Для нее требуется два аргумента, в которых сначала указывается имя файла, а затем режим работы. Режим можно указать как один из шести параметров в этой таблице.

Если попытка открыть файл не удалась, fopen возвращает значение false, иначе возвращается указатель файла, который используется для дальнейшего чтения или записи в этот файл.

После внесения изменений в открытый файл важно закрыть его с помощью функции fclose(). Для функции fclose() требуется в качестве аргумента указатель файла, после этого возвращается значение true, в этом случае закрытие осуществлено успешно, или false, если закрыть файл не удалось.

Как создать сайт самому?

Какие технологии и знания необходимы сегодня, чтобы создавать сайты самостоятельно? Узнайте на интенсиве!

Чтение файла

После того как файл был открыт с помощью функции fopen(), его можно считать с помощью функции fread(). Для этой функции требуется два аргумента. Это должны быть указатель файла и длина файла, выраженная в байтах. Длина файла может быть найдена с помощью функции filesize(), которая принимает имя файла в качестве аргумента и возвращает размер файла, выраженный в байтах. Итак, ниже приводятся этапы чтения файла PHP.

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

Получение длины файла, с помощь функции filesize()

Считывание файла с помощью функции fread()

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

В следующем примере содержимое текстового файла присваивается переменной, а затем это содержимое отображается на веб-странице.

Работа с файлами в php

Подборка PHP функций для работы с файлами.

Как создать новый файл и записать в него что-то?

Как прочитать содержимое текстового файла целиком?
1 способ.

Как прочитать содержимое текстового файла построчно?

Как добавить информацию в начало файла?

Как удалить строчку из файла?

Для удаления первой или последней строчки воспользуйтесь функциями: array_shift(); и array_push();, вместо array_splice(); .

Как послать файл пользователю?

Как получить массив файлов в каталоге с определенным расширением?

Как вывести случайную строку из файла?
Обычно такой вопрос задаются те, кто не использует какой-нибудь Базы Данных, тем не менее нуждается в ее функциях.
Вывести случайною строку из файла, например случайный анекдот можно так:

Функция rand(); получает два параметра: первый — 0, второй — количество элементов массива минус 1. Т.е. устанавливается диапазон выбора (минимум — максимум).

Как записать файл в определенной кодировке?

Как скопировать / переименовать / удалить файл или директорию?

Что такое права доступа ( CHMOD ) и как их изменить?
Права доступа показывают, какие операции (чтение, запись, выполнение) с файлом (директорией) может выполнять пользователь.
Права доступа определяются для 3 пользователей:
1. Хозяина (создавшего файл).
2. Группы, в которую входит хозяин файла.
3. Остальные пользователи.
Права доступа могут быть записанны как в буквенном, так и в символьном варианте.
В буквенном: drwxr-x-r-x (стандартные права для директорий).
Первый символ — специальный, показывающий чем этот файл является (в UNIX системах все представленно ввиде файлов, даже директории). d — директория.
Затем идут три комбинации, rwx — права для хоязина, r-x — права для группы, r-x — права доступа для отсальных пользователей.
r — пользователь имеет право чтения файла (по сути просто обратиться к нему).
w — пользователь имеет право записать / перезаписать файл.
x- показывает, что файл может быть исполнен (актуально для CGI сценариев).
В числовом варианте права каждого пользователя определяет цифра, которая складывается из суммы:
r — 4, w — 2, x -1. Таким образом drwxr-xr-x — 755.
Изменить права доступа можно либо с помощь FTP клиента, либо через shell.
С помощью PHP права доступа меняются функцией chmod().

В Операционных Системах Windows права доступа всегда 777.
Какую можно получить информацию о файле?
Информацию о файле можно получить с помощью функции:

Выведет массив, где:
0 — dev — устройство
1 — ino — inode — отедьная функция: fileinode();
2 — mode — inode protection mode
3 — nlink — number of links
4 — uid — идентификатор хоязина — отедьная функция: fileowner();
5 — gid — идентификатор группы — отедьная функция: filegroup();
6 — rdev — device type, if inode device *
7 — size — размер — отедьная функция: filesize();
8 — atime — время последнего доступа к файлу (Unix time) — отедьная функция: fileatime();
9 — mtime — время последней модификации файла (Unix time) — отедьная функция: filemtime();
10 — ctime — время создания файла (Unix time) — отедьная функция: filectime();
11 — blksize — blocksize of filesystem IO *
12 — blocks — number of blocks allocated
Аналогом данной функции является fstat(), но работает она с открытым указателем.
Как организовать файл INI и его парсинг (чтение и запись)?
В PHP существует возможность парсинга *.ini файлов, которые имеют тот же синтаксис, что и php.ini, т.е.:
[категория]
= ;

Для этого есть функция: parse_ini_file();

Если вы устанавливаете второй параметр — FALSE (или не укажите вовсе), то вы получите массив всех ключей и значений. Если укажите TRUE, то получите многомерный массив, где верхними элементами будут название категорий.
Обращаем ваше внимание, что *.ini файл по умолчанию воспринимается веб-сервером, как текстовый документ, поэтому не рекомендуем хранить в нем важные данные.
ВАЖНО: значение не состоящие из символов латинского алфавита или цифр должны быть заключены в кавычки.
Настоятельно не рекомендуем вам использовать не латинские символы.
Запись файла *.ini вам придется производить собственным алгоритмом.

Данные алгоритм не осуществляет проверку на не латинские символы и не производит их обрамление кавычками.

Как получить список всех каталогов и подкаталогов (сканинг папок) ?
Сканинг папок делается с помощью рекурсии, функции, которая вызывает саму себя.

Как узнать сколько места занимает на диске каталог?
Размер папки складывается из суммы размеров файлов внутри не и папок.

Как отредактировать определенную строчку в файле?

Как «обнулить» (очистить) содержимое файла?

Как посчитать количество файлов в папке и подпапках?

Как проверить на существование удаленный файл?

Как узнать размер удаленного файла?

PHP. Работа с файлами

Автор: Мухаметшин Д.Ф

Правильно работать с файлами должен уметь каждый программист. Данная статья ориентирована на начинающих PHP программистов, однако «сборник рецептов» будет полезен и продвинутым пользователям.
Работа с файлами разделяется на 3 этапа:

Открытие файла.
Манипуляции с данными.
Закрытие файла.

I. Открытие файла
Для того чтобы открыть файл в среде PHP используется функция fopen(). Обязательными параметрами этой функции является имя файла и режим файла.

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

Примечание: в конце любой из строк может существовать еще один необязательный параметр: b или t. Если указан b, то файл открывается в режиме бинарного чтения/записи. Если же t, то для файла устанавливается режим трансляции перевода строки, т.е. он воспринимается как текстовый.

Для демонстрации рассмотрим следующий сценарий:

II. Манипуляции с данными файла
Записывать данные в файл при помощи PHP можно при помощи функции fwrite(). Это функция принимает 2 обязательных параметра и 1 необязательный. В качестве обязательных параметров выступает дескриптор файла и режим файла:

Для построчного считывания файла используют функцию fgets(). Функция принимает 2 обязательных параметра:

Примечание: В данном примере значение 999 определяет количество символов, которые будут считываться до тех пор, пока указатель не достигнет конца файла (EOF).
Для того, чтобы считать файл как единое целое, нужно использовать функцию readfile(), принимающая 1 обязательный параметр. Функция открывает файл, отображает его содержимое в окне браузера, а затем закрывает файл:

Также можно использовать функцию fpassthru() которая принимает 1 обязательный параметр. Перед использованием этой функции необходимо открыть файл в режиме чтения. По окончанию считывания файла функция автоматически закрывает файл(при этом дескриптор файла становиться недействительным).

Очень часто встречаются ситуации, когда необходимо содержимое сайта считать в массив. Эту возможность предусматривает использование функции file(). При вызове этой функции, каждая строка файла сохранятся в отдельном элементе указанного массива.
Примечание: Не следует применять функцию file() к двоичным файлам (binary-safe), т.к. она не является безопасной в плане считывания двоичных файлов, если при этом, где-то встретиться символ конца файла (EOF), то она не гарантирует вам чтение всего двоичного файла.

Примечание: Работа с массивами подробно описывается здесь, авторы: Мухаметшин Д.Ф., Симдянов И.В.
В конце статьи, вы найдете хороший «сборник рецептов» по массивам, который дает решение многих проблем, с которыми ежедневно встречается веб-программист.
Давайте представим ситуацию, когда файл необходимо считать по символам. Для этого мы можем воспользоваться функцией fgetc(). Функция принимает единственный параметр. Функция полезна если нам необходимо найти какой-либо символ или количество одинаковых символов.

III. Закрытие файла
Закрытие файла происходить с помощью функции fclose(), которая принимает 1 обязательный параметр.

Сборник рецептов
1) Нам необходимо проверить существует ли тот или иной файл. Для этого мы воспользуемся функцией file_exists().

Примечание: Функция file_exists не производит проверку файлов на удаленном веб-сервере. Для правильной работы функции, файл со скриптом должен находиться на том сервере, где и проверяемый файл.

2) Определяем размер файла с помощью функции filesize()

3) Создание временного файла с помощью функции tmpfile()

4) Вам необходимо определить количество строк в файле. Для этого используем функцию count()

5) Нам необходимо использовать механизм блокировки файла

6) Нам необходимо удалить определенную строку из файла

7) Определение типа файла. Используем функцию filetype(), которая принимает единственный параметр

После вызова строка может содержат одно из следующих значений:
file – обычный файл
dir – каталог
ink – символическая ссылка
fifo – fifo-канал
block – блочно — ориентированное устройство
char – символьно — ориентированное устройство
unknown – неизвестный тип файла

8) Если вы хотите просмотреть все параметры файла, то следует воспользоваться функцией stat()

9) Нам необходимо очистить файл, используем функцию ftruncate()

10) Нам необходимо узнать дату последнего изменения файла, используем функцию filectime(). Функция возвращает значение времени в форме Unix timestamp.

Работа с файлами на PHP

Очень часто люди хотят заказать интернет-магазин, в котором часть информации будет записываться в файлы. Например, различные отчеты, сверки и т.д. Это удобно, т.к. не обязательно всегда с собой носить пароли от системы управления интернет-магазином, а можно просто скинуть текстовой файлик на флешку.

Для записи и чтения файлов есть функция fopen, рассмотрим на примере.

Запись в файл

Тут мы открываем файл, параметр «w» говорит что файл будет для записи. В переменную $handle записываем id-ресурса файла для последующей работы с ним (например записи, или чтения).

Помимо «w» в php есть следующие параметры:

r — чтение

w — запись, если файла не существует, то он создается, если файл существует, то вся информация в нем стирается

a — дозапись, если файла не существует, то он создается, если файл существует, то информация записывается в конец

Чтение из файла

Дозапись файла

Функцией filesize(«1.txt») — мы подсчитываем количество символов в файле, тоесть читаем файл полностью.
Если указать вместо filesize(«1.txt») — цифру 10, то будут прочтены первые 10 символов

Запись массива в файл

Иногда требуется записать в файл не строку, а массив. Для этих целей есть функция serialize/unserialize.

Функция serialize преобразует массив в строку, которую мы можем записать в файл. Функция unserialize делает обратную операцию, преобразует строку в массив.
Вот пример:

php создание файла, чтение и запись

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

Чтобы создать файл на php в исполняемом скрипте надо всего лишь указать несколько функций:

Рассмотрим сразу пример:

Тут вы должны знать :

fopen() — функция открывает файл чтения или для записи и уточнениями;

Это уточнения (параметр mode функции fopen) очень важно:

  • «r» — открыть файл в php ТОЛЬКО для чтения . Курсор помещается в начало.
  • «r+» — открыть файл в php для чтения и для записи . Курсор помещается в начало. . — при этих двух режимах r и r+ файлы уже должны быть созданы(иначе вылезет ошибка Warning: fopen(file.txt) [function.fopen]: failed to open stream: No such file or directory in . ), а мы лишь читаем или у нас есть возможность дописывать.
  • «w» — открывается файл ТОЛЬКО для записи. Файл урезается до нулевой длины — то есть затирается. Записывается, что нужно и Курсор ставится в начало.
  • «w+» — открывается файл для записи И ЧТЕНИЯ! Остальное то же самое что и в режиме «w». . — при этих двух режимах — если файл не был создан — ПРЕДПРИМЕТСЯ ПОПЫТКА ЕГО СОЗДАТЬ!
  • «a» — открыть файл ТОЛЬКО для записи. В отличие от «w» этот параметр не затирает содержимое файла, а ставит курсор в конец строки и добавляет в конец содержимое, которое мы хотели добавить.
  • «a+» — открыть файл для записи и чтения.

fwrite($fp, $text) — функция записи в файл на php — то есть то что находится в переменной $text записывается в файл, который находится в переменной $fp;

fclose($fp) — функция закрытия файла, который мы записали в переменную $fp;

Все теперь вы спокойно можете создавать правильно файлы на php, открывать их для чтения и редактирования.

Полезные дополнения и функции PHP для работы с открытым файлом:

while(!feof($fp)) <
$mytext = fgets($fp, 99);
echo $mytext.»
«;
>

здесь выполняется условие — «пока не достигнут конец файла то делай то то» while(!feof($fp))

1. Функция fgets ($fp, 99) — позволяет разделить все содержимое на участки в 99 байт и далее, чтобы это отчетливее увидеть мы помещаем тег

Эта функция string fgets ( resource handle [, int length] ) по умолчанию принимает в параметр length 1024 байта(1 килобайт), если не указать так и будет. Этот параметр необязателен с PHP 4.2.0 (В случае ошибки возвращает FALSE)

Доп функции для открытия, записи и создания файла

Функция — int readfile ( string filename [, bool use_include_path [, resource context]] ) — считываем файл как единое целое.

Читает файл и записывает содержимое в буфер вывода. И возвращает количество выведенных байт. В случае ошибки вернет, если не использована собачка — @readfile.

Что-то подобное получится:

В конце слова тег стоят
.

б. Функция — array file ( string filename [, int use_include_path [, resource context]] ), делает то же самое, что и функция readfile, за одним исключением она добавляет содержимое файла в массив:

Таким образом можно считывать любые странички в интернете: $lines = file(‘https://saitsozdanie.ru/’); и перебрать массив через функцию foreach;

3а. Функция string file_get_contents ( string filename [, bool use_include_path [, resource context [, int offset [, int maxlen]]]] ) — позволяет получить содержимое в виде одной строки.

Это более универсальная функция PHP для считывания файла, похожа на функцию file, только содержимое возвращается в строку, а не в массив и можно задавать условия — с какого байта начинать — offset и с какого заканчивать — maxlen. При неудаче вернет FALSE.

Важно. — в этом случае функция заменяет сразу 3: fopen(), fread() и fclose() и таким образом избавляет от мароки.

3б. Функция int file_put_contents ( string filename, mixed data [, int flags [, resource context]] ) — идентична последовательному вызову функций fopen(), fwrite() и fclose() — возвращает количество записанных байт.

Более новые статьи:

  • Для тех, кто только начинает изучать PHP — заголовки HTTP является каким-то туманом, который почему-то не особо приятный. давайте его рассеивать. Люб …

«>Заголовки HTTP через PHP — 04/03/2020 18:55
Часто в PHP нужно вывести все файлы и каталоги в виде списка. это нужно, чтобы нам сразу узнать где у нас, чего и сколько. давайте приступать. …

«>PHP вывод файлов и каталогов директории — 24/02/2020 20:59
На PHP часто нужна загрузка файлов на сервер. приятно же, если у вашего сайта есть возможность загружать файлы на сайт: картинки или другие текстовые …

Более старые статьи:

  • Конструкция switch — переключатель на php бывает в некоторых случаях незаменима, и увеличивает быстродействие. …

«>switch тонкости
На сайте часто могут возникать ошибки PHP, в этой статье будим их разбирать.

«>Ошибки PHP
Суперглобальный массив $_SERVER — это то на чем стоит остановится и изучить, если вы встали на путь программирования. Он вам может показать самую важн …

file_get_contents — Читает содержимое файла в строку

(PHP 4 >= 4.3.0, PHP 5, PHP 7)

file_get_contents — Читает содержимое файла в строку

Описание

Данная функция похожа на функцию file() с той только разницей, что file_get_contents() возвращает содержимое файла в строке, начиная с указанного смещения offset и до maxlen байт. В случае неудачи, file_get_contents() вернёт FALSE .

Использование функции file_get_contents() наиболее предпочтительно в случае необходимости получить содержимое файла целиком, поскольку для улучшения производительности функция использует технику отображения файла в память (memory mapping), если она поддерживается вашей операционной системой.

Если вы открываете URI содержащий спецсимволы, такие как пробел, вам нужно закодировать URI при помощи urlencode() .

Список параметров

Имя читаемого файла.

Начиная с версии PHP 5 можно использовать константу FILE_USE_INCLUDE_PATH для поиска файла в include path.

Корректный ресурс контекста, созданный с помощью функции stream_context_create() . Если в использовании особого контекста нет необходимости, можно пропустить этот параметр передав в него значение NULL .

Смещение, с которого начнется чтение оригинального потока.

Поиск смещения ( offset ) не поддерживается при работе с удаленными файлами. Попытка поиска смещения на нелокальных файлах может работать при небольших смещениях, но этот результат является непредсказуемым, так как он работает на буферизованном потоке.

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

Возвращаемые значения

Функция возвращает прочтенные данные или FALSE в случае возникновения ошибки.

Эта функция может возвращать как boolean FALSE , так и не-boolean значение, которое приводится к FALSE . За более подробной информацией обратитесь к разделу Булев тип. Используйте оператор === для проверки значения, возвращаемого этой функцией.

Ошибки

Будет сгенерирована ошибка уровня E_WARNING , если параметр filename не удается найти, параметр maxlength меньше нуля или поиск по смещению offset в потоке завершается неудачно.

Примеры

Пример #1 Получить и вывести исходный код домашней страницы вебсайта

Пример #2 Поиск файлов в include_path

Пример #3 Чтение секции файла

Результатом выполнения данного примера будет что-то подобное:

Пример #4 Использование потоковых контекстов

// Создаем поток
$opts = array(
‘http’ =>array(
‘method’ => «GET» ,
‘header’ => «Accept-language: en\r\n» .
«Cookie: foo=bar\r\n»
)
);

$context = stream_context_create ( $opts );

// Открываем файл с помощью установленных выше HTTP-заголовков
$file = file_get_contents ( ‘https://www.example.com/’ , false , $context );
?>

Список изменений

Версия Описание
5.1.0 Добавлены аргументы offset и maxlen .

Примечания

Замечание: Эта функция безопасна для обработки данных в двоичной форме.

Для этой функции вы можете использовать URL в качестве имени файла, если была включена опция fopen wrappers. Смотрите более подробную информацию об определении имени файла в описании функции fopen() . Смотрите также список поддерживаемых оберток URL, их возможности, замечания по использованию и список предопределенных констант в Поддерживаемые протоколы и обработчики (wrappers).

При использовании SSL, Microsoft IIS нарушает протокол, закрывая соединение без отправки индикатора close_notify. PHP сообщит об этом как «SSL: Fatal Protocol Error» в тот момент, когда вы достигнете конца данных. Чтобы обойти это, вы должны установить error_reporting на уровень, исключающий E_WARNING. PHP версий 4.3.7 и старше умеет определять, что на стороне сервера находится проблемный IIS при открытии потока с помощью обертки https:// и не выводит предупреждение. Если вы используете fsockopen() для создания ssl:// сокета, вы сами отвечаете за определение и подавление этого предупреждения.

Смотрите также

  • file() — Читает содержимое файла и помещает его в массив
  • fgets() — Читает строку из файла
  • fread() — Бинарно-безопасное чтение файла
  • readfile() — Выводит файл
  • file_put_contents() — Пишет строку в файл
  • stream_get_contents() — Читает оставшуюся часть потока в строку
  • stream_context_create() — Создаёт контекст потока
  • $http_response_header
Мастер Йода рекомендует:  Обзор конструктора сайтов Nethouse и пример создания сайта
Добавить комментарий