PHP: fopen() Разрешение отклонено

Я смущен этим кодом:

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, некоторые действия отрицаются. Поэтому мне просто нужно избавиться от защиты.

Ответы

Ответ 1

попробовать

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

а

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

скорее всего, выглядит в другом каталоге

Ответ 2

Эта проблема также может быть результатом включения 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

Ответ 3

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

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

$getsebool -a | grep httpd

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

Я мучительно пошел и включил все булевы, используя команду setsebool, пока не исчезла ошибка "не удалось открыть поток.

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

Ответ 4

Используйте fopen($_SERVER['DOCUMENT_ROOT'].'test.txt','a+');

Ответ 5

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

echo getcwd();

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

Ответ 6

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

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

chcon httpd_user_content_t test.txt

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

Ответ 7

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

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

sudo chown daemon/path/to/folder

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

sudo chmod g+w/path/to/folder