Php дописать в начало файла

Обновлено: 05.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. И не могу добавить данных в начало файла. Открываю через fopen($file,"a+"), но он открывает заменяет, а не на вставляет. В интернете советуют какие-то феерические решения типа: "file_put_contents('file.txt', "Новая первая строка \r\n" . file_get_contents('file.txt'))".

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

MarkoPolo
> Открываю через fopen($file,"a+"), но он открывает заменяет, а не на вставляет.
"a+" нужно для вставки в конец. Попробуй "+a".

MarkoPolo
> Даже я - ноль в php, исходя из здравого смысла, понимаю, что это совсем
> нехорошо считать весь файл в память, открыть его на запись, дописать и
> приделать сзади переменную в которую считали файл.
Инопланетяне что-то ждут с открытием новых откровений - как записывать данные в начало файла, не перезаписывая его полностью.

Zefick
> "a+" нужно для вставки в конец. Попробуй "+a".
Спасибо, помог.

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

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

Высокоуровневый способ есть:
. решения типа: "file_put_contents('file.txt', "Новая первая строка \r\n" . file_get_contents('file.txt'))".
можно обернуть в функцию или даже класс.

=A=L=X=
Это ведь не то что надо, ты сам понимаешь. Меня расстраивала необходимость копировать через основную память.

MarkoPolo
> Это ведь не то что надо, ты сам понимаешь. Меня расстраивала необходимость
> копировать через основную память.

Так собственно вычислительная техника в наше время по-другому с данными работать не умеет. Весь похапе - сплошной набор левых классов, которые с каждой новой версией всовывают в виде "встроенных" решений. Ну сделают file_put_contents_in_front() в каком-нить похапэ 6.0. Все равно будет работать код типа "file_put_contents('file.txt', "Новая первая строка \r\n" . file_get_contents('file.txt'))", только его уже не будет видно.

Веб оно конечно вебом, но работает все еще на тех же компьютерах, что и всё остальное ))

killbot
> Веб оно конечно вебом, но работает все еще на тех же компьютерах, что и всё
> остальное ))
Да, мне просто с первого взгляда показалось такое раздолье и типы объявлять не надо, и оператор конкатенация строк, и ответы вручную генерить можно, и вообще столько всякого барахла.

MarkoPolo
> Да, мне просто с первого взгляда показалось такое раздолье и типы объявлять не
> надо, и оператор конкатенация строк, и ответы вручную генерить можно, и вообще
> столько всякого барахла.

Всё это барахло не отменяет принципов работы файловой системы. А она такая же как в C++.

MarkoPolo
> Да, мне просто с первого взгляда показалось такое раздолье и типы объявлять не
> надо, и оператор конкатенация строк, и ответы вручную генерить можно, и вообще
> столько всякого барахла.

Ага, еще бы пару функций типа generate_krutoy_sait(), generate_mmog(), sdelat_peacedato() )))))))))))

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

lossless
> MarkoPolo
> а какой практический смысл писать в начало файла? не встречал случая, когда это
> необходимо. ничто не мешает перевернуть файл на выходе, читать строки с хвоста,
> переписать в любой момент и т.д..
И так каждый раз формировать страницу с конца наперед при выдаче клиенту. Если считать, что рядовой посетитель больше читает, нежели пишет получаем меньшую нагрузку.

killbot
> Ага, еще бы пару функций типа generate_krutoy_sait(), generate_mmog(),
> sdelat_peacedato() )))))))))))
Я не волшебник, я только учусь.

Вообще, какие только жуткие вопросы по php в моем мозгу не возникают, на все в рунете находятся ответы. Либо я раньше гуглить не умел, либо по php действительно у многих возникает так много жутких вопросов.

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

MarkoPolo
>Я не волшебник, я только учусь.
Да я ж не со зла )) Наоборот даже )

> А еще в php меня прикольнуло то, что кулхацкер может в какую-нибудь бинарную
> шнягу вписать php код, потом залить к тебе на сайт и поиметь.

уверен, что задача правильно решается? может есть смысл использовать SQLite.

Привет, я хочу добавить строку в начале файла, используя php.

Предположим, например, что файл содержит следующую оболочку:

И теперь я хочу добавить строку поверх следующего вида:

Это код, который у меня есть на данный момент в script.

Я хочу для него оптимальное решение, так как я использую его в PHP скрипт. Вот некоторые решения, которые я нашел здесь:
Нужно писать в начале файла с PHP

в котором говорится следующее, чтобы добавить в начале:

Итак, мой последний вопрос: лучший метод использования (я имею в виду оптимальный) среди всех вышеперечисленных методов. Есть ли что-то лучше, чем выше?

Ищите свои мысли об этом.

спросил(а) 2013-06-07T10:08:00+04:00 8 лет, 5 месяцев назад ответил(а) 2013-06-07T10:24:00+04:00 8 лет, 5 месяцев назад

Вы имеете в виду добавление. Я предлагаю вам прочитать строку и заменить ее следующей строкой, не теряя данные.

ответил(а) 2013-06-07T10:51:00+04:00 8 лет, 5 месяцев назад

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

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

На ваш комментарий вы можете создать три файла header , content и footer и вывести каждый из них последовательно; что бы избежать копирования, даже если header создается после content .

работать с реверсом в одном файле

Этот метод помещает файл в память (массив).

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

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

Затем, чтобы прочитать файл для вывода

Тогда есть еще одно соображение: вы могли бы вообще не использовать файлы - например, через PHP APC

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