web-dev-qa-db-fra.com

PHP: autorisation fopen () refusée

Je suis confus avec ce code:

test.php:

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

quand je l'exécute, j'obtiens une erreur:

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

où est le problème?

Merci beaucoup! J'ai trouvé le problème, j'utilise le FC13, à cause de la protection de SELinux, une action est refusée. Donc, j'ai juste besoin de me débarrasser de la protection.

17
T_t

Ce problème peut également résulter de l'activation de SELinux. Cela peut être résolu en utilisant:

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

Vous pouvez en savoir plus sur les contextes à 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

16
mistapink

essayer

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

comme

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

recherche probablement dans un autre répertoire

13
Phill Pafford

J'ai reçu la même erreur "Échec de l'ouverture du flux. Autorisation refusée" lors de la tentative d'écriture d'un fichier sur le serveur à l'aide de PHP. J'ai tout essayé sur Internet pour corriger l'erreur. J'ai changé la propriété des fichiers, répertoires et sous-répertoires du serveur en "Apache", j'ai fait un "chmod 777" sur tous les fichiers, répertoires et sous-répertoires, j'ai exécuté "restorecon -R", j'ai exécuté "chcon unconfined_u: object_r: httpd_user_content_t: s0 "sur tous les fichiers, mais la seule chose qui semblait fonctionner était de désactiver complètement SELinux.

J'ai finalement résolu le problème. Le problème résidait dans les paramètres booléens utilisés par SELinux. J'ai exécuté la commande suivante pour obtenir une liste de tous les booléens liés à httpd.

$ getsebool -a | grep httpd

Cela a donné une liste d'environ 36 paramètres.

Je suis allé douloureusement et j'ai activé chaque booléen à l'aide de la commande setsebool jusqu'à ce que l'erreur "échec d'ouverture du flux. Permission refusée" disparaisse.

Lorsque j'ai activé "booléen" httpd_unified, l'erreur a disparu !! Quand je l'ai éteint, l'erreur est revenue !!

8
kwatts

Utilisez fopen($_SERVER['DOCUMENT_ROOT'].'test.txt','a+');

6
Warrior

Vérifiez le mode de contexte SELinux du fichier pour vous assurer qu'il est défini sur: httpd_user_content_t

... Si ce n'est pas le cas, utilisez:

chcon httpd_user_content_t test.txt

... pour corriger le problème.

4
vdbuilder

Les chemins d'accès provoquent toujours des problèmes lors de l'ouverture de fichiers. Un moyen simple d'éviter tout problème lorsque vous tentez d'ouvrir des fichiers consiste à vérifier dans quel répertoire vous vous trouvez et où vous appelez.

echo getcwd();

Créez une simple page PHP et faites un appel imprimez le répertoire courant. Déposez la page PHP dans le même répertoire que le fichier, et il vous indiquera le chemin correct vers le dossier, puis ajoutez simplement le /filename.xxx.

4
Kyle

J'utilise un serveur HTTP Apache v2.4, je pense que la méthode suivante fonctionnera pour la plupart des gens sur Linux:
vérifiez d'abord qui est l'utilisateur exécutant 'httpd'.
C'est daemon dans mon cas, et je ne sais pas si c'est le cas pour tout le monde. vous pouvez le faire en utilisant:
ps -ef | grep 'httpd'

une fois que vous êtes sûr que l'utilisateur daemon est le propriétaire du processus httpd, changez le propriétaire du dossier dans lequel vous souhaitez autoriser l'écriture dans deamon

Sudo chown daemon /path/to/folder

cela ne changera que l'utilisateur, le groupe de ce répertoire reste inchangé. si vous voulez que le groupe puisse également écrire, assurez-vous qu'il a la permission d'écrire

Sudo chmod g+w /path/to/folder

0
HElanabi