file put contents php не работает
файл put contents разрешение отказано
функции file_put_contents(запросы.тхт) [функция.файл-положить-содержание]: не удалось открыть поток: разрешение отказано
у меня есть queries.txt файл chmod’D для 777, в чем может быть проблема?
11 ответов
попробуйте настроить разрешения каталога.
из терминала запустите chmod 777 database (из каталога, содержащего папку базы данных)
apache и никто не будет иметь доступа к этому каталогу, если он chmodd’Ed правильно.
другое, что нужно сделать, это эхо » getcwd ()». Это покажет вам текущий каталог, и если это не ‘/что-то. / database / ‘ then you’ll need to change ‘query.txt ‘ к полному пути для вашего сервера.
другой вариант
что нужно делать file_put_contents работать сейчас. Но для большей безопасности лучше также установить разрешения, как показано ниже
понимаю, что это довольно старый сейчас, но нет необходимости вручную писать запросы к такому файлу. MySQL имеет встроенную поддержку ведения журнала, вам просто нужно включить ее в вашей среде разработки.
взгляните на документацию для «общего журнала запросов»:
ребята у меня была эта проблема в течение 1 месяца и сделал все, но не смог ее исправить, но теперь я знаю решение.
Я использую общий хостинг linux, когда мой администратор изменил php на 5.3, я получил много ошибок для кода «file_put_contents». попробуйте проверить мой план:
в вашем хосте создайте файл, подобный mytest.php, и поместите этот код и сохраните:
откройте URL «www.your-domain.com/mytest.php-один раз, а потом проверь почту. у вас должно быть письмо у вашего хоста с информацией, которую вы ввели в mytest.php, проверьте имя отправителя. если его от никто у вас есть проблема с «отказано в разрешении», потому что что-то не определено, и если имя отправителя похоже на мой идентификатор: iietj8qy@hostname5.netly.net у тебя нет проблем.
мой администратор изменил сервер и снова установил хост, я думаю, и проблема решена, скажите администрации хоста, что я сказал вам, и, возможно, они найдут ответ.
надеюсь, что это помогает тебе!
Я знаю, что это очень старый вопрос, но я хотела добавить хорошее решение в подробные разъяснения. Вам нужно будет выполнить два оператора на Ubuntu, как системы, а затем он работает как шарм.
разрешения в Linux могут быть представлены тремя цифрами. Первая цифра определяет разрешение владельца файлов. Вторая цифра-разрешения определенной группы пользователей. Третья цифра определяет разрешения для всех пользователей, которые не являются владельцами и не член группы.
веб-сервер должен выполнять с идентификатором, который является членом группы. Веб-сервер никогда не должен работать с тем же идентификатором, что и владелец файлов и каталогов. В Ubuntu работает apache под id www-data. Этот идентификатор должен быть членом группы, для которой указаны разрешения.
чтобы предоставить каталогу, в котором вы хотите изменить содержимое файлов, соответствующие права, выполните заявление:
.Это означало бы в вопросе OP, что разрешения для каталога %ROOT%/database должны быть изменены соответствующим образом. Поэтому важно не иметь файлов в этом каталоге, которые никогда не должны изменяться или удаляться. Поэтому рекомендуется создать отдельный каталог для файлов, содержимое которых необходимо изменить.
разрешения на чтение (4) для каталога означает возможность собрать все файлы и каталоги с их метаданные в каталоге. Запись (2) дает разрешение на изменение содержимого каталога. Подразумевается добавление и удаление файлов, изменение разрешений и т. д.. Разрешение на выполнение (1) означает, что вы имеете право войти в этот каталог. Без последнего невозможно углубиться в каталог. Веб-серверу необходимы разрешения на чтение, запись и выполнение при изменении содержимого файла. Для этого нужна группа цифра 7.
второй утверждение находится в вопросе о OP:
возможность чтения и записи документа требуется, но не требуется для выполнения файла. 7 дается владельцу файлов, 6-группе. Веб-сервер не нужно иметь разрешение на выполнение файла, чтобы изменить его содержание. Эти разрешения на запись должны быть предоставлены только файлам в этом каталоге.
всем другим пользователям не следует давать никаких разрешений.
для каталоги, которые не требуют изменения своих файлов, являются достаточными разрешениями группы 5. Документация о разрешениях и некоторые примеры:
file_put_contents
file_put_contents — Пишет данные в файл
Описание
Список параметров
Путь к записываемому файлу.
Значением параметра flags может быть любая комбинация следующих флагов, соединённых бинарным оператором ИЛИ ( | ).
Возвращаемые значения
Функция возвращает количество записанных байт в файл, или false в случае возникновения ошибки.
Примеры
Пример #1 Пример простого использования
Пример #2 Использование флагов
Примечания
Замечание: Эта функция безопасна для обработки данных в двоичной форме.
Смотрите также
User Contributed Notes 36 notes
File put contents fails if you try to put a file in a directory that doesn’t exist. This creates the directory.
It should be obvious that this should only be used if you’re making one write, if you are writing multiple times to the same file you should handle it yourself with fopen and fwrite, the fclose when you are done writing.
real 0m3.932s
user 0m2.487s
sys 0m1.437s
real 0m2.265s
user 0m1.819s
sys 0m0.445s
Please note that when saving using an FTP host, an additional stream context must be passed through telling PHP to overwrite the file.
/* the file content */
$content = «this is just a test.» ;
I faced the problem of converting a downloaded csv file that had Windows-1252 encoding, so to convert it to UTF-8 this worked for me:
$from = ‘Windows-1252’;
$to = ‘UTF-8’;
where «$this->path()» has the path of the file. Using this the file is converted from Windows-1252 to UTF-8.
With this you can import it with mysqlimport with no problems.
This functionality is now implemented in the PEAR package PHP_Compat.
More information about using this function without upgrading your version of PHP can be found on the below link:
I suggest to expand file_force_contents() function of TrentTompkins at gmail dot com by adding verification if patch is like: «../foo/bar/file»
It’s important to understand that LOCK_EX will not prevent reading the file unless you also explicitly acquire a read lock (shared locked) with the PHP ‘flock’ function.
i.e. in concurrent scenarios file_get_contents may return empty if you don’t wrap it like this:
Make sure not to corrupt anything in case of failure.
__DIR__ is your friend.
In reply to the previous note:
If you want to emulate this function in PHP4, you need to return the bytes written as well as support for arrays, flags.
I can only figure out the FILE_APPEND flag and array support. If I could figure out «resource context» and the other flags, I would include those too.
File put contents fails if you try to put a file in a directory that doesn’t exist. This function creates the directory.
file name including folder.
* example :: /path/to/file/filename.ext or filename.ext
This function doesn’t return False if all data isn’t write, especially when data is a stream resource
I’m updating a function that was posted, as it would fail if there was no directory. It also returns the final value so you can determine if the actual file was written.
As to the previous user note, it would be wise to include that code within a conditional statement, as to prevent re-defining file_put_contents and the FILE_APPEND constant in PHP 5:
file_put_contents() strips the last line ending
If you really want an extra line ending at the end of a file when writing with file_put_contents(), you must append an extra PHP_EOL to the end of the line as follows.
I made a ftp_put_contents function.
//FTP username
$cfg_user = «user» ;
//FTP password
$cfg_pass = «password» ;
//Document Root of FTP
$cfg_document_root = «DOCUMENT ROOT OF FTP» ;
//Link to the website
$cfg_site_link = «Link to the website» ;
Что не так с функцией file_put_contents() в PHP?
Если в кратце, то суть такая: file_put_contents() не атомарен и не гарантирует записи данных файл, а может вообще очистить его содержимое так и не записав новое содержимое.
Синтаксический сахар это хорошо. Судя по описанию, функция file_put_contents() идентична последовательным успешным вызовам функций fopen(), fwrite() и fclose(), что влечёт за собой некоторые особенности, связанные с этими функциями. Сразу скажу, что пробовал воспроизводить это только внутри Docker контейнеров и утилизацией диска близкой к 100%, возможно в другом окружении такое поведение воспроизводиться не будет. Для начала давайте с умным видом посмотрим исходник PHP 7.1.12.
Собственно, какие шаги можно увидеть?
А что, если скрипт прервётся (например, kill, Control + C, reset) после открытия файл в в режиме w, либо в режиме c после php_stream_truncate_set_size, но не дойдя до php_stream_copy_to_stream_ex или php_stream_write? Правильно, файл останется абсолютно пустым! Т.е. вызывая функцию file_put_contents() существует вероятность получить абсолютно пустой файл, вместо его предшествующего содержимого.
Такую же ситуацию можно получить, если вызывать поочерёдно fopen(), fwrite() и fclose(). На вскидку приходит несколько способов защиты от такого побочного эффекта.
Во-первых, не пользоваться для сохранения значимых данных файлами. Гораздо надёжнее использовать полноценные СУБД с их атомарностью в рамках транзакций, что защитит даже от внезапной остановки сервера, при условии использования журналируемой файловой системы, либо InnoDB Doublewrite Buffer в MySQL и его аналогов в других СУБД. Как вариант, можно рассмотреть NoSQL и Key-Value решения, в случаях остановки PHP скрипта они защитят от потери данных. Но, для случаев внезапной остановки сервера нужно изучить их работу.
Во-вторых, если уж всё-таки хочется писать в файл, то лучше каждую новую запись писать в новый файл, с последующей подменой его на старый.
В-третьих, можно воспользоваться таким кодом:
Обратите внимание на открытие файла в режиме c.
Затем поверх старого содержимого пишется новое содержимое. Т.к. новое содержимое может быть короче, чем старое, нужно как-то дополнительно пометить конец данных, для этого в моём примере используется ‘$’, что является последовательностью символов 100% не входящую в полезные данные. После чего файл обрезается до длины полезных данных. А теперь рассмотрим этот алгоритм пошагово.
В одной из библиотек на github нашёл такой вариант решения проблемы:
Читайте также
Очень крутая задача, в которой не всё так просто, как кажется на первый взгляд. Попробуйте найти в ней 2 логические…
В некоторых docker-контейнерах при запуске консольных приложений, вместо программы может отобразиться ошибка:
Иногда при обработке с помощью PHP больших и не очень данных, можно словить досадную ошибку посреди выполнения скрипта: PHP Fatal…
php file_put_contents function not working
Why would file_put_contents refuse to work for the following code?
5 Answers 5
It could be a permission problem
Is the directory /files chmoded to 777? sometimes php won’t allow you to access directories if they don’t have enough permission. I don’t know about blank errors though.
Try to see if it has enough permissions, if not, then set it to 777 and try it.
Are you using the full path on the filesystem or are you trying to use the URI? I think this PHP function expects you to give the path as the file is found on the filesystem.
Relative paths should be okay though.
You may need to make sure the file exists and that it’s permissions are set to 777. Sometimes I’ve found that it’s not enough to just have the directory permissions set to 777 but the file must also already exist.
It is because of SELINUX.
You can mark the folder as of type httpd_sys_rw_content_t with this command to enable writing to this folder.
We’ve experienced this, requiring a workaround (regardless of method, permissions and anything else mentioned here). When all other fixes failed, we have found it can be linked to restrictions created by SELinux.
If you’re using windows the following solution worked perfectly for me on Windows 10 running php 5.5.38
If you’re having this problem on Windows/IIS try the following:
Функция php file_put_contents не работает
Почему file_put_contents отказывается работать со следующим кодом?
Это может быть проблема с разрешением
Каталог изменен на 777? иногда php не позволяет вам получить доступ к каталогам, если у них недостаточно прав. Однако я не знаю о пустых ошибках.
Попробуйте проверить, достаточно ли у него разрешений, если нет, то установите его на 777 и попробуйте.
Вы используете полный путь к файловой системе или пытаетесь использовать URI? Я думаю, что эта функция PHP ожидает, что вы укажете путь, поскольку файл находится в файловой системе.
Однако с относительными путями все в порядке.
Возможно, вам потребуется убедиться, что файл существует и что для него установлены права доступа 777. Иногда я обнаруживал, что недостаточно просто установить права доступа к каталогу на 777, но файл также должен уже существовать.
Мы столкнулись с этим и потребовали обходного пути (независимо от метода, разрешений и всего остального, упомянутого здесь). Когда все остальные исправления не удалось, мы обнаружили, что это может быть связано с ограничениями, созданными SELinux.
Если вы используете Windows, следующее решение отлично сработало для меня в Windows 10 с PHP 5.5.38.
Если у вас возникла эта проблема в Windows / IIS, попробуйте следующее:
Вы можете пометить папку как тип httpd_sys_rw_content_t с помощью этой команды, чтобы разрешить запись в эту папку.