PHP: fopen () Отказано в доступе - PullRequest
       45

PHP: fopen () Отказано в доступе

17 голосов
/ 07 октября 2010

Я запутался с этим кодом:

test.php:

fopen('test.txt','a+');

когда я его выполняю, я получаю сообщение об ошибке:

Warning: fopen(test.txt): failed to open stream:
     Permission denied in /var/www/html/yuelu3/mobile/text.php on line 2

test.txt:

-rwxrwxrwx. 1 jt jt     87 10月  7 20:58 test.txt

в чем проблема?

Большое спасибо! Я нашел проблему, я использую FC13, из-за защиты SELinux некоторые действия запрещены. Так что мне просто нужно избавиться от защиты.

Ответы [ 7 ]

15 голосов
/ 25 апреля 2016

Эта проблема также может быть результатом включения SELinux.Это можно решить с помощью:

chown -R apache:apache /var/www/html/directory_to_write
chcon -R -t httpd_sys_content_t /var/www/html/directory_to_write
chcon -R -t httpd_sys_rw_content_t /var/www/html/directory_to_write

Подробнее о контекстах можно узнать по адресу https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Confined_Services/sect-Managing_Confined_Services-The_Apache_HTTP_Server-Types.html

13 голосов
/ 07 октября 2010

1001 * попробовать *

fopen('/path/to/file/test.txt','a+');

в

fopen('test.txt','a+');

скорее всего ищет в другом каталоге

8 голосов
/ 17 сентября 2015

Я получаю ту же ошибку "Не удалось открыть поток. В доступе отказано" при попытке записи файла на сервер с использованием PHP.Я попробовал все в интернете, чтобы исправить ошибку.Я изменил владельца файлов, каталогов и подкаталогов на сервере на «apache», я сделал «chmod 777» для всех файлов, каталогов, подкаталогов, я запустил «restorecon -R», я запустил «chcon unsfined_u: object_r:httpd_user_content_t: s0 "для всех файлов, но единственное, что, похоже, сработало, - это полное отключение SELinux.

Я наконец решил проблему.Проблема заключалась в булевых параметрах, используемых SELinux.Я выполнил следующую команду, чтобы получить список всех логических значений, связанных с httpd.

$ getsebool -a |grep httpd

Это дало список из примерно 36 параметров.

Я мучительно шел и включал каждый логический параметр с помощью команды setsebool до тех пор, пока не исчезла ошибка «Не удалось открыть поток. В доступе отказано».

Когда я включил логическое значение httpd_unified, ошибка исчезла !!Когда я выключил его, ошибка вернулась !!

6 голосов
/ 07 октября 2010

Использование fopen($_SERVER['DOCUMENT_ROOT'].'test.txt','a+');

4 голосов
/ 02 декабря 2011

Проверьте режим контекста SELinux для файла, чтобы убедиться, что он установлен на: httpd_user_content_t

... Если это не так, используйте:

chcon httpd_user_content_t test.txt

... чтобы исправить проблему.

4 голосов
/ 07 октября 2010

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

echo getcwd();

Создайте простую страницу PHP иВызов распечатать текущий каталог.Перетащите страницу PHP в ту же директорию, что и файл, и она сообщит вам правильный путь к папке, а затем просто добавьте /filename.xxx.

0 голосов
/ 28 марта 2019

Я использую сервер Apache HTTP v2.4, я думаю, что следующий метод будет работать для большинства людей в linux:
прежде всего проверьте, кто является пользователем, запустившим httpd.* в моем случае, и я не уверен, так ли это для всех.Вы можете сделать это, используя:
ps -ef | grep 'httpd'

, когда вы уверены, что пользователь daemon является владельцем процесса httpd, измените владельца папки, в которой вы хотитеразрешение на запись в deamon

sudo chown daemon /path/to/folder

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

sudo chmod g+w /path/to/folder

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...