Php дописать в начало файла
С помощью функции 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
Читайте также: