file_put_contents - не удалось открыть поток: отказано в разрешении

98

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

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

Но я получаю

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

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

Hailwood
источник
Вы просматривали php.iniфайл на предмет чего-либо, что могло бы препятствовать доступу к файлу?
Hello71 07
2
также убедитесь, что каталог настроен правильно
Crayon Violent
1
также попробуйте использовать абсолютное имя файла. Возможно, ваша интерпретация текущей папки отличается от интерпретации PHP
laher
1
Можете ли вы дважды проверить этот статус chmod?
Иона
1
Для такого рода проблем есть контрольный список устранения неполадок: stackoverflow.com/questions/36577020/…
Вик Сидублейью

Ответы:

74

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

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

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

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

Джейсон
источник
106
Разве 777 не представляет угрозы безопасности?
hitautodestruct
12
Я сильно подозреваю, что не только целевой каталог должен быть доступен для записи учетной записи сервера, но и каждый родительский каталог целевого каталога должен позволять учетной записи сервера переходить в него; Думаю, это было бы + x к разрешениям.
Erhannis
2
Я экспериментировал с теориями Эрханниса на новом стеке LAMP, и теория верна.
thotheolh 05
4
@MajidFouladpour, я думаю chmod +x /parent/directory, для каждого родительского каталога цели. chmod +x /parent/directory, chmod +x /parentи т. д.
Erhannis
1
Теперь существует контрольный список устранения неполадок для такого рода проблем: stackoverflow.com/questions/36577020/…
Vic Seedoubleyew
19

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

это то, что вы можете сделать 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
Азерафати
источник
7

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

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

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

Адам
источник
3

Ребята, у меня эта проблема была 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, проверьте имя отправителя. если это от Никто, у вас есть проблема с "Permission Denied", потому что что-то не определено, и если имя отправителя похоже на мой идентификатор: iietj8qy@hostname5.netly.net, у вас нет проблем.

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

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

Хесам
источник
Я совсем заблудился !! Что ты пытаешься сказать? Если вы говорите, что пользователь apache не смог получить имя хоста на сервере (общий или что-то еще), то вам пора пересмотреть свой выбор службы хостинга.
Fr0zenFyr
3

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

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

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

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

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

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

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

Второе утверждение относится к ОП:

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/

Лук Бергман
источник
3

Сбор информации по этой ссылке. Stackoverflow-image save не работает с chmod 777 и от пользователя azerafati и Loek Bergman.

если вы заглянете в файл / etc / apache / envvars, вы увидите что-то вроде:

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

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

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

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

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

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

Брюс Тонг
источник
1

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

Я просто исправил это, открыв nautilus ( sudo nautilus) и щелкнув правой кнопкой мыши файл, который вы пытаетесь открыть, щелкните свойства> Настройки> и разрешите чтение и запись всем остальным.

г -_- б
источник
0

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

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

Дэйв
источник
0

Это можно решить, выполнив следующие действия:

1. $ php artisan cache:clear

2. $ sudo chmod -R 777 storage

3. $ composer dump-autoload

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


источник
0

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

php artisan cache:clear

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

Дипеш Тхапа
источник
0

это может помочь. У меня это сработало. попробуйте в терминале

setenforce 0

Литин Иосиф
источник
-3

Вот решение. Чтобы скопировать 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)
Masterhoo
источник
-3

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

Салман Мохаммад
источник
2
Это ужасно небезопасная и крайне плохая практика. Его также трудно обнаружить и исправить при разработке пользовательских приложений, и его легко упустить из виду. Пожалуйста, определите правильные разрешения.
ftrotter
-11

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

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

может не работать (даже если синтаксис верен), но

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

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

Киванч
источник
17
Это не так. во всех случаях $dir."/file.txt"функционально эквивалентен "$dir/file.txt", если предполагается, что $dirэто строка. Более того, это поведение не задокументировано на php.net, как утверждает Kivanc.
mattbasta