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.
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
essayer
fopen('/path/to/file/test.txt','a+');
comme
fopen('test.txt','a+');
recherche probablement dans un autre répertoire
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 !!
Utilisez fopen($_SERVER['DOCUMENT_ROOT'].'test.txt','a+');
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.
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.
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