Php file put contents не пишет в файл
Обновлено: 21.08.2024
В настоящее время у меня есть скрипт php, который запускается, когда браузер браузера просматривает веб-страницу. Я пытаюсь написать текстовый файл при запуске скрипта, который хранит переменную. Владельцем папки является Apache, но все читали и пишут, строго для целей тестирования. (Я подумал, что это может быть проблема с разрешениями) SELINUX включен на сервере, и когда я запускаю скрипт из консоли, он прекрасно создает текстовый файл, и в правильном каталоге.
Вероятно, ваша проблема связана с тем, что у Apache нет прав на запись в указанное вами местоположение файла. Перейдите в этот каталог и проверьте разрешения и принадлежность группы с помощью команды ls :
В выходных данных есть три столбца, которые показывают права доступа, владельца и группу для каталога. Скорее всего, они принадлежат пользователю root и не имеют разрешения для Apache на запись в каталог.
Если это так, то вы увидите ошибку в вашем журнале Apache, когда он попытается создать файл. Попробуйте настроить журналы во время работы скрипта в браузере:
Недавно у меня возникла такая же проблема, и я наткнулся на этот вопрос. К сожалению, choppyfireballs OP сказал в комментарии, что он нашел свое собственное решение и просто принял ответ, который не помог никому из нас . Затем после поиска и успеха, чтобы file_put_contents снова заработать, я решил поделиться своим решением.
Права доступа к моим файлам и каталогам были в порядке, чтобы принимать любые записи (убедитесь, что ваши каталоги имеют chmod 757 , это даст корню и другим право на запись файлов в локации). Если это все еще не работает, как это не для меня, это потому, что ваша система, вероятно, SELinux (Security Enhanced Linux).
Если вы хотите убедиться, что напишите setenforce 0 , это переключит selinux в разрешающий режим, снова запустите ваш скрипт, если он работает, это означает, что проблема хорошо описана.
В этом случае включите selinux обратно setenforce 1 и попробуйте ls -Zl в каталоге, где находится каталог вашего проекта. это даст вам строку, как
сначала вам нужно принять любой public_content_rw_t контекст для записи файла. Тип
Теперь вы должны сказать SELinux, что каталог вашего проекта - public_content_rw_t , иначе вы все равно не сможете писать файлы. Тип :
и restorecon -RvF /project , чтобы сказать selinux применить вышеуказанные спецификации.
Теперь ваш каталог public_content_rw_t , и вы сможете писать файлы.
Я столкнулся с этой проблемой тоже. В моем случае я обнаружил, что владение каталогом было неправильным. Для типичной установки Apache каталог должен принадлежать www-data: www-data, а не root: root.
В настоящее время у меня есть скрипт php, который запускается, когда браузер переходит на веб-страницу. Я пытаюсь написать текстовый файл при запуске сценария, в котором хранится переменная. Владелец папки - apache, но у всех есть чтение и запись, строго в целях тестирования. (Я подумал, что это может быть проблема с разрешениями) SELINUX включен на сервере, и когда я запускаю сценарий с консоли, он создает текстовый файл просто отлично и в правильном каталоге.
Вероятно, ваша проблема связана с тем, что apache не имеет разрешений на запись в указанное вами расположение файла. Перейдите в этот каталог и проверьте разрешения и владение группой с помощью команды ls :
В выходных данных есть три столбца, в которых показаны разрешения, владелец и группа для каталога. Скорее всего, они принадлежат пользователю root и не имеют разрешений для apache на запись в каталог.
Я уверен, что мое решение действительно понятно, но оно сработало:
Вы пробовали изменить каталог с помощью chmodding на 777 ?
Возможно, что-то написано с ошибкой. ^
Что-то еще, что можно попробовать для людей, задающих аналогичный вопрос. Возможно, вы просто делаете простую ошибку, которая не требует от вас возиться с правами доступа к файлам - и если вы делаете эту ошибку, исправление прав доступа к файлам может не помочь.
Убедитесь, что вы используете локальный относительный путь к файлу в file_put_contents ().
Я тоже столкнулся с этой проблемой. В моем случае я обнаружил, что владелец каталога был неправильным. Для типичной установки Apache каталог должен принадлежать www-data: www-data, а не root: root.
Недавно у меня была такая же проблема, и я наткнулся на этот вопрос. К сожалению, choppyfireballs, OP сказал в комментарии, что он нашел свое собственное решение и просто принял ответ, который не помог никому из нас . Затем, после поиска и успеха, чтобы снова заставить file_put_contents работать, я решил поделиться своим решением.
Разрешения моих файлов и каталогов были в порядке, чтобы принимать любую запись (убедитесь, что ваши каталоги chmod 757 , это даст корню и остальным право на запись файлов в это местоположение). Если он по-прежнему не работает так, как у меня, это потому, что ваша система, вероятно, является системой SELinux (Security Enhanced Linux).
Если вы хотите убедиться, что напишите setenforce 0 , это переведет selinux в разрешающий режим, снова запустите ваш скрипт, если он работает, значит, проблема хорошо описана.
В этом случае включите selinux обратно setenforce 1 и попробуйте ls -Zl в каталоге, где находится каталог вашего проекта. это даст вам строку вроде
Сначала вам нужно принять любые контексты public_content_rw_t для записи файла. Тип
Теперь вы должны сказать SELinux, что каталог вашего проекта - public_content_rw_t , иначе вы все равно не сможете записывать файлы. Тип :
И restorecon -RvF /project , чтобы сообщить selinux о применении вышеуказанных спецификаций.
Теперь ваш каталог public_content_rw_t , и вы должны иметь возможность записывать файлы.
Я пытаюсь написать запрос в файл для отладки. Файл находится в database/execute.php . Файл, в который я хочу написать, это database/queries.php .
Я пытаюсь использовать file_put_contents('queries.txt', $query)
функции file_put_contents(запросы.тхт) [функция.файл-положить-содержание]: не удалось открыть поток: разрешение отказано
у меня есть queries.txt файл chmod'D для 777, в чем может быть проблема?
попробуйте настроить разрешения каталога.
из терминала запустите chmod 777 database (из каталога, содержащего папку базы данных)
apache и никто не будет иметь доступа к этому каталогу, если он chmodd'Ed правильно.
другое, что нужно сделать, это эхо " getcwd ()". Это покажет вам текущий каталог, и если это не '/что-то. / database / ' then you'll need to change 'query.txt ' к полному пути для вашего сервера.
что вы можете сделать Apache (www-data) , владельцем папки
что нужно делать file_put_contents работать сейчас. Но для большей безопасности лучше также установить разрешения, как показано ниже
- изменить /var/www в корневую папку ваших php-файлов
понимаю, что это довольно старый сейчас, но нет необходимости вручную писать запросы к такому файлу. MySQL имеет встроенную поддержку ведения журнала, вам просто нужно включить ее в вашей среде разработки.
взгляните на документацию для "общего журнала запросов":
Я использую общий хостинг linux, когда мой администратор изменил php на 5.3, я получил много ошибок для кода "file_put_contents". попробуйте проверить мой план:
в вашем хосте создайте файл, подобный mytest.php, и поместите этот код и сохраните:
мой администратор изменил сервер и снова установил хост, я думаю, и проблема решена, скажите администрации хоста, что я сказал вам, и, возможно, они найдут ответ.
надеюсь, что это помогает тебе!
Я знаю, что это очень старый вопрос, но я хотела добавить хорошее решение в подробные разъяснения. Вам нужно будет выполнить два оператора на Ubuntu, как системы, а затем он работает как шарм.
разрешения в Linux могут быть представлены тремя цифрами. Первая цифра определяет разрешение владельца файлов. Вторая цифра-разрешения определенной группы пользователей. Третья цифра определяет разрешения для всех пользователей, которые не являются владельцами и не член группы.
веб-сервер должен выполнять с идентификатором, который является членом группы. Веб-сервер никогда не должен работать с тем же идентификатором, что и владелец файлов и каталогов. В Ubuntu работает apache под id www-data. Этот идентификатор должен быть членом группы, для которой указаны разрешения.
чтобы предоставить каталогу, в котором вы хотите изменить содержимое файлов, соответствующие права, выполните заявление:
.Это означало бы в вопросе OP, что разрешения для каталога %ROOT%/database должны быть изменены соответствующим образом. Поэтому важно не иметь файлов в этом каталоге, которые никогда не должны изменяться или удаляться. Поэтому рекомендуется создать отдельный каталог для файлов, содержимое которых необходимо изменить.
разрешения на чтение (4) для каталога означает возможность собрать все файлы и каталоги с их метаданные в каталоге. Запись (2) дает разрешение на изменение содержимого каталога. Подразумевается добавление и удаление файлов, изменение разрешений и т. д.. Разрешение на выполнение (1) означает, что вы имеете право войти в этот каталог. Без последнего невозможно углубиться в каталог. Веб-серверу необходимы разрешения на чтение, запись и выполнение при изменении содержимого файла. Для этого нужна группа цифра 7.
второй утверждение находится в вопросе о OP:
возможность чтения и записи документа требуется, но не требуется для выполнения файла. 7 дается владельцу файлов, 6-группе. Веб-сервер не нужно иметь разрешение на выполнение файла, чтобы изменить его содержание. Эти разрешения на запись должны быть предоставлены только файлам в этом каталоге.
всем другим пользователям не следует давать никаких разрешений.
для каталоги, которые не требуют изменения своих файлов, являются достаточными разрешениями группы 5. Документация о разрешениях и некоторые примеры:
В учебнике функция 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 кода с переменными!
Чтобы ничего не придумывать, мы возьмем живой пример, как записываю я, тот код, который должен исполниться! Как вы поняли из нашего сайта, но если не поняли то тоже скажу - что нам периодически приходится приводить примеры того, как тот или иной код работает,поэтому унас есть в админке, о которой я даже снял некоторое видео. экскурсию
На скрине - отдельное поле, в который вставляется тот код, который должен исполниться:
Читайте также: