Php дописать в конец файла

Обновлено: 06.07.2024

С помощью функции file_get_contents() можно получить содержимое файла:

Также мы можем получить html-код какой-либо страницы в интернете:

Но работает это далеко не для всех сайтов, у многих есть защита от такого примитивного парсинга.

Чтение файла: file()

Функция file() позволяет получить содержимое файла в виде массива. Разделителем элементов является символ переноса строки.

Создадим в корне сайта файл data.txt со следующим содержимым:

Теперь запустим скрипт index.php со следующим кодом:

При запуске этого скрипта мы получим в браузере:

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

Примеры сохранения и чтения текстовых данных и массивов в файлы.

Сохранение в файл

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

File_put_contents:

Fopen / fwrite:

Набор функций fopen, fwrite, fclose предназначены для более гибкой работы с файлами.

  • fopen – открытие или создание файла.
  • fwrite – запись данных.
  • fclose – закрытие файла.

Возможные режимы fopen():

Mode Описание
r Открывает файл только для чтения, помещает указатель в начало файла.
r+ Открывает файл для чтения и записи, помещает указатель в начало файла.
w Открывает файл только для записи, помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует – пробует его создать.
w+ Открывает файл для чтения и записи, помещает указатель в начало файла и обрезает файл до нулевой длины. Если файл не существует – пытается его создать.
a Открывает файл только для записи, помещает указатель в конец файла. Если файл не существует – пытается его создать.
a+ Открывает файл для чтения и записи, помещает указатель в конец файла. Если файл не существует – пытается его создать.
x Создаёт и открывает только для записи; помещает указатель в начало файла. Если файл уже существует, вызов fopen() закончится неудачей, вернёт false и выдаст ошибку. Если файл не существует, попытается его создать.
x+ Создаёт и открывает для чтения и записи, в остальном имеет то же поведение, что и « x ».
c Открывает файл только для записи. Если файл не существует, то он создаётся. Если же файл существует, то он не обрезается (в отличие от « w »), и вызов к этой функции не вызывает ошибку (также как и в случае с « x »). Указатель на файл будет установлен на начало файла.
c+ Открывает файл для чтения и записи, в остальном имеет то же поведение, что и « c ».

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

В учебнике функция file_put_contents представлена таким видом:

int file_put_contents ( string $filename , mixed $data [, int $flags = 0 [, resource $context ]] )

Разбор синтаксиса file_put_contents

Если вы впервые увидели функцию, а тем более file_put_contents, то скорее всего вам мало понятен выше приведенный синтаксис file_put_contents - поэтому! Давайте его разберем по косточкам!

int - при удачной работе, вернет "int" - тип данных, целое число.

file_put_contents - название функции.

string - первое значение должно быть типом string - строка → $filename - путь сохранения - лучше использовать путь на сервере.

mixed $data - тип записываемых данных, смешанный(string или array).

int $flags - флаги, о них отдельно ниже.

resource $context - Корректный ресурс контекста, созданный с помощью функции stream_context_create().(никогда не пользовался.)

Флаги для file_put_contents

Флаги для file_put_contents - это очень полезная вещь!

FILE_USE_INCLUDE_PATH - Ищет filename в подключаемых директориях. Подробнее смотрите директиву include_path.(никогда не пользовался.)

FILE_APPEND - при использовании данного флага, функция "file_put_contents" запишет новые данные в конец файла, а не перезапишет ваш файл полностью.

LOCK_EX - закрывает файл в момент записи.

Синтаксис - это конечно хорошо, но я его никогда таким образом не запоминал.

Упрощенный синтаксис для file_put_contents

Чтобы можно было запомнить, упросим написание синтаксиса функции file_put_contents:

file_put_contents("file_dir", "data", FILE_APPEND | LOCK_EX);

file_dir -> путь до файла, если путь указан только названием файла, например primer.txt , то файл создастся в той папке, где расположен файл со скриптом. Исключение -> если у вас на сайте единая точка входа, то файл в таком случае будет сохраняться в корневую папку. Тогда нужно указывать путь на сервере до файла. Если файл по указанному адресу не существует, но путь до папки существует, то файл будет создан! Иначе ошибка.

data -> данные, это может быть строка или массив.

FILE_APPEND -> флаг, который указывает на то, что запись будет производится в конец строки. Если флаг не указан, то файл будет перезаписываться!

LOCK_EX -> флаг, который указывает на то, что в момент записи файл будет недоступен для других пользователей!

Видео : Запись в файл с помощью file_put_content из формы

Не забываем сказать спасибо! Я старался для вас!

Записать данные в файл с помощью file_put_contents

Для того, чтобы записать данные в файл нам понадобится функция "file_put_contents".

Путь для записи с помощью file_put_contents

Как я уже неоднократно говорил выше, что путь лучше использовать на сервере до файла.

Смысла не вижу говорить о других вариантах - я их не использую.

Данные для записи с помощью file_put_contents

Как вы уже поняли, то "file_put_contents" может записать строку, это можно сделать таким образом(кавычки, в данном пример можно использовать, как одинарные так и двойные.):

Простой одинарный массив можно записать таким образом смотри подробности записи массива:

Для записи многомерного массива понадобится - serialize - превратить массив в строку.

Куда будем записывать данные с помощью file_put_contents

Мы должны определиться, как и что мы хотим записать.

Первый раз записать или перезаписать данные в файле, тогда здесь

Ошибка записи файла в функции file_put_contents

Как и из-за чего может возникнуть ошибка в функции file_put_contents.

При первом создании файла ВСЕГДА (кроме), будет возникать ошибка типа Warning , потому, что файл еще не существует!

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

Если путь не существует, то функция file_put_contents вернет такую же ошибку:

Warning: file_put_contents("путь_до_файла"): failed to open stream: No such file or directory in путь on line строка

Для ликвидации ошибки failed to open stream можно пользоваться собакой

Записать данные в файл, с ограничением 1 раз в сутки

В данном пункте нет никаких форм ввода, нужно только зайти на

тестовую страницу для записи в файл сегодняшней даты.

Как я уже говорил, что начал переписывать страницу снизу и. этот скрипт короче предыдущих, поэтому его можно практически всего описать! погнали:

Поучим дату в переменную:

Получаем данные из файла file_get_contents

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

Записать/перезаписать текст в файле через форму

Как бы странно это не звучало, но обновлял страницу с конца, поэтому, как и в предыдущих пунктах, прежде чем приступить к теме -> "Записать/перезаписать текст в файле через форму" у нас есть для данного пункта:

Его же можно скачать -> в архиве

Это не такая сложная тема - "Записать/перезаписать текст в файле через форму" -> не стал делать дополнительных фильтров и собрал совсем простой код. Итак, что у нас есть.

Из формы получаем с помощью post в переменную текст:

Единственный фильтр поставил на количество символов:

$count = count(preg_split("//u",$new_text ,-1,PREG_SPLIT_NO_EMPTY));

С условием если количество больше 50 :

Его же можно скачать -> в архиве

Теперь давайте разберемся как работает выше приведенный пример и вообще как записывать в конец файла -> нам понадобится:

Путь до файла $dir_file -> путь до папки должен существовать физически, иначе будет ошибка записи в файл
Путь до файла должен быть на сервере

Далее -> данные для записи в конец файла $data, в нашем примере туда будет попадать текст из формы через post запрос.

Для того, чтобы запись в файл происходило в конец файла, нужно поставить флаг FILE_APPEND

И если вам нужен перенос, после данных ставим его -> . "\n" , это должно выглядеть примерно так:

Нам осталось собрать весь код вместе, его как уже говорилось вы можете скачать -> в архиве

Где может применяться запись в конец файла !? В одном из видео я делал экскурсию по своей админке и вот там, в том числе, применялась запись в файл в начало строки.

Запись происходит в несколько файлов, и вот запись на главную делается в конец файла!

Как записывать строку в начало файла с помощью file_put_contents ?

Как можно записать в начало файла через php в файл!? Повторимся, что у нас есть :
К сожалению у функции file_put_contents нет такого флага, чтобы записать в уже имеющийся контент в начало файла -> что нужно сделать!?

Получить существующий контент в переменную с помощью file_get_contents

Поставить новый текст перед полученным, если требуется перенос строки ставим перенос:

file_put_contents( $dir_file_server, $data . "\n" . file_get_contents($dir_file));

Где -> путь до папки от корневой:

$dir_folder = '/__a-data/__all_for_scripts/__examples/php/tets_zapisi/';

Название файла, куда будем записывать в начало файла:

$dir_file_server = $_SERVER['DOCUMENT_ROOT'].$dir_folder.$name_file; Все переменные и описание касаются того примера о котором мы уже сказали выше.
Где может применяться запись в начало файла !? В одном из видео я делал экскурсию по своей админке и вот там, в том числе, применялась запись в файл в начало строки

Как записать исполняемый код php в файл

Но вот вопрос! Как записать в файл исполняемый код!? Т.е. при записи он не должен выполниться, но уже на самой странице, куда был записан выполнится!?

В самом начале скажем пару слов :

Я уже делал страницу, где в реальности в каждый новый файл записывался html каркас страницы! -> здесь. А исполняемый php код - в нем нужно просто заэкранировать, либо поместить переменные в одинарные кавычки!

И где он применяется у меня на сайте!? На 115 секунде записываются данные на страницу, как раз в этом видео. все данные относительно страницы записываются в виде php кода с переменными!

Чтобы ничего не придумывать, мы возьмем живой пример, как записываю я, тот код, который должен исполниться! Как вы поняли из нашего сайта, но если не поняли то тоже скажу - что нам периодически приходится приводить примеры того, как тот или иной код работает,поэтому унас есть в админке, о которой я даже снял некоторое видео. экскурсию

На скрине - отдельное поле, в который вставляется тот код, который должен исполниться:

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

Построчное чтение из файла

Для начала давайте научимся читать файлы. Давайте создадим текстовый файл file.txt и запишем в него следующий текст:

Давайте теперь считаем его с помощью программы на языке php. Создайте файл files.php и запишите в него следующий код:

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

Построчное чтение файла на PHP

Давайте теперь разберём по шагам нашу программу.

  1. Функция fopen открывает файл. Первым аргументом указывается путь до файла, вторым аргументом указывается режим для работы с файлом. В нашем случае это 'r' – чтение (от read). Ознакомьтесь с другими режимами работы в документации по функции. Данная функция возвращает ресурс — это еще один тип данных, с которым мы ранее не работали. Ресурс в PHP – это ссылка на какой-то внешний ресурс (файл, база данных и т. п.). Работа с ресурсами происходит с помощью специальных функций. Более детально о ресурсах вы можете прочитать тут.
  2. В цикле for четыре раза вызывается функция fgets. Эта функция считывает строку из файла и перемещает текущий курсор на следующую строку (курсор можете представить себе как обычный курсор в текстовом редакторе, который просто перемещается в момент считывания данных из файла). Если снова вызвать эту функцию, она сделает то же самое для следующей строки. Возвращает эта функция считанную строку (string).
  3. Ресурс закрывается с помощью функции fclose. Делать это следует всегда, несмотря на то, что PHP по завершении работы программы сделает это сам. Дело в том, что если открыть файл в блокирующем режиме (например, для записи, в режиме 'w'), то он будет недоступен для других процессов, они будут ждать, пока предыдущий ресурс освободит этот файл.

Как вы понимаете, для чтения не очень удобно использовать цикл for с указанием конкретного числа строк, которые необходимо считать. Для этого можно использовать функцию feof – она возвращает true, если достигнут конец файла, и false – если нет.

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

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

Построчная запись в файл

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

А для записи в файл строки используется функция fputs(). Первым аргументом указывается ресурс, а вторым — строка, которую необходимо записать в файл. Давайте в качестве примера напишем программу, которая запишет в файл file2.txt числа от 1 до 100.

Константа PHP_EOL содержит в себе символ переноса строки. При этом для разных операционных систем (Windows или Unix-подобных) эти символы будут разными.

Дозаписываем в конец файла

При этом если сейчас запустить программу снова, то старые данные в файле file2.txt перезапишутся новыми. Для того, чтобы сохранить содержимое файла и дозаписать данные в конец, нужно использовать режим работы с файлом “a” (от append – присоединять, добавлять).

Если мы запустим этот скипт дважды, то в файле file3.txt будет две строки “abc”.

Читаем файл целиком

В PHP также имеется возможность прочитать весь файл за раз. Для этого используется функция file_get_contents().

Данный код выведет всё то же четверостишие, только без переноса строк.

Чтение файла целиком на PHP

Так произошло потому, что в самом первом примере мы добавляли тег <br> после каждой прочитанной строки. Если же мы откроем исходный код страницы, то увидим, что на самом деле переносы строк в исходном коде сохранены.

Исходник прочитанного файла

Запись в файл данных целиком

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

Если снова запустить этот код, файл перезапишется. Для того, чтобы дополнить файл у этой функции есть третий аргумент — режим работы с файлом. Для дозаписи в конец файла следует использовать константу FILE_APPEND.

Какой способ выбрать

Данные способы отличаются в первую очередь тем, что когда мы считываем файл целиком, или записываем в него много данных за раз, нам приходится хранить в оперативной памяти больше данных, чем если бы мы работали по отдельности с каждой строкой. Если данных не слишком много, об этом можно не беспокоиться. Однако, если вы читаете файл размером 10 Гб, а на компьютере, на котором выполняется скрипт, всего 4Гб оперативной памяти, то его получится считать только построчно. При попытке загрузить его целиком программа упадёт с ошибкой о нехватке памяти.

Читайте также: