Недопустимое разрешение file_put_contents

Я пытаюсь написать запрос к файлу для отладки. Файл находится в database/execute.php. Файл, который я хочу записать, это database/queries.php.

Я пытаюсь использовать file_put_contents('queries.txt', $query)

Но я получаю

file_put_contents (queries.txt) [function.file-put-contents]: не удалось открыть поток: Разрешение отказано

У меня есть файл queries.txt chmod'd до 777, что может быть проблема?

Ответ 1

Попробуйте настроить права доступа к каталогам.

с терминала, запустите chmod 777 database (из каталога, содержащего папку базы данных)

apache, и никто не будет иметь доступ к этому каталогу, если он корректно chmodd.

Другое дело - echo "getcwd()". Это покажет вам текущий каталог, и если это не "/something.../database/", вам нужно будет изменить "query.txt" на полный путь для вашего сервера.

Ответ 2

Другой вариант

заключается в том, что вы можете сделать Apache (www-data), владельца папки

sudo chown -R www-data:www-data /var/www

который должен теперь работать file_put_contents. Но для большей безопасности вам лучше также установить разрешения, как показано ниже

find /var/www -type d -print0 | xargs -0 chmod 0755 # folder
find /var/www -type f -print0 | xargs -0 chmod 0644 # files
  • измените /var/www на корневую папку ваших php файлов.

Ответ 3

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

Взгляните на документацию для "общего журнала запросов":

http://dev.mysql.com/doc/refman/5.1/en/query-log.html

Ответ 4

Ребята, у меня была эта проблема в течение 1 месяца, и я сделал все, но не смог ее исправить, но теперь я знаю решение.

Я использую общий хостинг linux, когда мой администратор изменил php на 5.3. У меня появилось много ошибок для кода "file_put_contents". попробуйте проверить мой план:

В вашем хосте создайте файл, например mytest.php, и вставьте этот код и сохраните:

<?php        mail('Your-EMail','Email-Title','Email-Message');        ?>

Откройте URL-адрес "www.your-domain.com/mytest.php" один раз, а затем проверьте свою электронную почту. вы должны иметь электронную почту с вашего хоста с информацией, введенной вами в mytest.php, проверить имя отправителя. если у вас есть Никто, у вас есть проблема с "Разрешением отказа", потому что что-то не определено и если имя отправителя похоже на мой id: [email protected], у вас нет проблемы.

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

надеюсь, что это поможет вам!

Ответ 5

Я знаю, что это очень старый вопрос, но я хотел добавить хорошее решение с некоторыми подробными объяснениями. Вам нужно будет выполнить два утверждения по подобным системам Ubuntu, а затем он работает как шарм.

Разрешения в Linux могут быть представлены тремя цифрами. Первая цифра определяет разрешение владельца файлов. Вторая цифра - права определенной группы пользователей. Третья цифра определяет разрешения для всех пользователей, которые не являются владельцем или членом группы.

Предполагается, что веб-сервер будет выполняться с идентификатором, который является членом группы. Веб-сервер никогда не должен запускаться с тем же идентификатором, что и владелец файлов и каталогов. В Ubuntu работает apache под ID-данными id. Этот идентификатор должен быть членом группы, для которой указаны разрешения.

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

find %DIR% -type d -exec chmod 770 {} \;

. Это означало бы в вопросе о том, что необходимо соответствующим образом изменить разрешения для каталога% ROOT%/database. Поэтому важно не иметь файлы внутри этого каталога, которые никогда не должны меняться или удаляться. Именно поэтому рекомендуется создать отдельный каталог для файлов, содержимое которых необходимо изменить.

Разрешения на чтение (4) для каталога означают возможность собирать все файлы и каталоги с их метаданными в каталоге. Разрешение записи (2) дает разрешение на изменение содержимого каталога. Это означает, что вы добавляете и удаляете файлы, меняете разрешения и т.д. Разрешение на выполнение (1) означает, что вы имеете право перейти в этот каталог. Без последнего невозможно глубже войти в каталог. Веб-серверу необходимы права на чтение, запись и выполнение при изменении содержимого файла. Поэтому для группы требуется цифра 7.

Второе утверждение находится в вопросе OP:

find %DOCUMENT_ROOT%/database -type f -exec chmod 760 {} \;

Требуется чтение и запись документа, но выполнение этого файла не требуется. 7 предоставляется владельцу файлов, а 6 - группе. Веб-серверу не нужно иметь разрешение на выполнение файла, чтобы изменить его содержимое. Эти права на запись должны указываться только в файлах в этом каталоге.

Все другие пользователи не должны получать никаких разрешений.

Для каталогов, которые не требуют изменения его файлов, допустимы групповые разрешения 5. Документация о разрешениях и некоторые примеры:

https://wiki.debian.org/Permissions

https://www.linux.com/learn/tutorials/309527-understanding-linux-file-permissions

http://www.linux.org/threads/file-permissions-chmod.4094/

Ответ 6

Сбор информации по этой ссылке fooobar.com/questions/89744/... и от пользователя azerafati и Loek Bergman

если вы хотите посмотреть файл /etc/apache/envvars, вы увидите что-то вроде:

export APACHE_RUN_USER=www-data
export APACHE_RUN_GROUP=www-data

Apache запускается под именем пользователя www-data​​p >

'0755' означает, что владелец файла может читать/записывать/выполнять, но группы и другие пользователи не могут писать. поэтому в терминале ur, cd в папку, содержащую вашу папку "images". затем введите:

find images -type d -exec chmod 0755 {} \;
find images -type f -exec chmod 0755 {} \;
sudo chown -R www-data:www-data images

вы должны сначала сменить передачу, прежде чем сменить владельца. введите свой пароль при появлении запроса. это сделает владелец www-data папки с изображениями.

ваша загрузка должна теперь работать.

Ответ 7

Для тех, кто использует Ubuntu и получает эту ошибку при загрузке страницы локально, но не в службе веб-хостинга,

Я просто исправил это, открыв nautilus (sudo nautilus) и щелкнув правой кнопкой мыши на файле, который вы пытаетесь открыть, щелкните свойствa > Настройки > и дайте read write для всех остальных

Ответ 8

была такая же проблема; моя проблема заключалась в том, что selinux был принудительно установлен.

Я продолжал получать сообщение об ошибке "Не удалось открыть поток: отказано в доступе" даже после перехода на 777 chmoding и проверки того, что все родительские папки имеют разрешения на выполнение для пользователя apache. Оказывается, моя проблема была в том, что selinux был настроен на принудительное выполнение (я на centos7), это devbox, поэтому я отключил его.

Ответ 9

Это может быть решено с помощью следующих шагов:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

Надеюсь, поможет

Ответ 10

Если вы загружаете git с локального на сервер, вам иногда нужно будет очистить кеш из-за файлов представлений, которые он загружает вместе с ним/или других кэшированных файлов.

php artisan cache:clear

Иногда может случиться так, что ваше приложение работало до git pull

Ответ 11

Есть 2 пути решения этих проблем
1. используйте chmod 777 path-to-your-directory. Если он не работает, тогда
2. просто укажите полный путь к файлу query.txt.

Ответ 12

Здесь решение. Чтобы скопировать img из URL-адреса. этот URL: http://url/img.jpg

$image_Url=file_get_contents('http://url/img.jpg');

создайте желаемый путь, закончите имя с помощью .jpg

$file_destino_path="imagenes/my_image.jpg";

file_put_contents($file_destino_path, $image_Url)

Ответ 13

Кроме того, как сказано в file_put_contents man page в php.net, остерегайтесь проблем с именами.

file_put_contents($dir."/file.txt", "hello");

может не работать (хотя это верно и в синтаксисе), но

file_put_contents("$dir/file.txt", "hello");

работает. Я испытал это на разных установленных серверах php.