J'essaie de créer un répertoire avec la fonction PHP mkdir mais j'obtiens une erreur comme suit : Warning: mkdir() [function.mkdir]: Permission denied in ...
. Comment régler le problème ?
Réponses
Trop de publicités?Je sais que c'est un vieux fil de discussion, mais il faut une meilleure réponse. Vous ne devriez pas avoir besoin de définir les autorisations à 777, c'est un problème de sécurité car cela donne un accès en lecture et en écriture au monde entier. Il se peut que votre utilisateur apache n'ait pas les droits de lecture/écriture sur le répertoire.
Voici ce que vous devez faire dans Ubuntu
-
Assurez-vous que tous les fichiers appartiennent au groupe et à l'utilisateur Apache. Dans Ubuntu, il s'agit du groupe www-data groupe et utilisateur
sudo chown -R www-data:www-data /path/to/webserver/www
-
Ensuite, tous les membres du groupe www-data ont le droit de lire et d'écrire des fichiers.
sudo chmod -R g+rw /path/to/webserver/www
Le php mkdir()
La fonction devrait maintenant fonctionner sans renvoyer d'erreurs
Apache a besoin de la permission d'écrire des choses comme le cache et les journaux... c'est juste une question de réglage fin.
@simpleengine Bonjour, j'ai remarqué votre réponse Je rencontre le même problème avec un projet que j'essaie de créer dans CodeIgnter et que je développe dans Ubuntu 14.14 Lts Pourriez-vous m'expliquer plus en détail les étapes que je dois suivre pour corriger cette erreur ? Pour vous donner quelques informations supplémentaires : le chemin absolu est le suivant /opt/lampp/htdocs/www/my-app/public/uploads
.. En gros, ce que j'essaie de faire, c'est que chaque utilisateur connecté puisse télécharger des fichiers dans le dossier "uploads" et créer des dossiers "albums" (ce qui sera fait avec php) pour stocker les photos .
Réponse tardive pour les personnes qui trouveront ceci via google à l'avenir. J'ai rencontré le même problème.
NOTE : JE SUIS SUR MAC OSX LION
Ce qui se passe, c'est qu'apache est exécuté en tant qu'utilisateur "_www" et qu'il n'a pas le droit de modifier les fichiers. Vous remarquerez qu'AUCUNE fonction du système de fichiers ne fonctionne via php.
Comment réparer :
Ouvrez une fenêtre finder et dans la barre de menu, choisissez Go > Go To Folder > /private/etc/apache2
Ouvrez maintenant httpd.conf
trouver :
User _www
Group _www
changer le nom d'utilisateur :
User <YOUR LOGIN USERNAME>
Maintenant redémarrez apache en exécutant cette forme terminal :
sudo apachectl -k restart
Si ça ne marche toujours pas, il se trouve que j'ai fait ce qui suit avant de faire ce qui précède. Cela pourrait être lié.
Ouvrez un terminal et exécutez les commandes suivantes : (note, mes fichiers de serveur web sont situés dans /Library/WebServer/www, à modifier en fonction de l'emplacement de votre site web)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
Cette solution fonctionne, mais permet à Apache de faire des ravages sur votre système si quelqu'un l'amène à exécuter un code malveillant (par exemple, via l'exploit Shellshock). Une alternative serait de laisser Apache s'exécuter en tant que _www
et créez un groupe pour vous et Apache. Créez un nouveau groupe, appelé par exemple trusted
et mettez vous et _www
dans celui-ci. Ensuite, faites de Trusted le groupe propriétaire de tous les fichiers du répertoire des documents de votre serveur. Enfin, faites chmod g+rwx
si nécessaire, uniquement sur les fichiers auxquels Apache doit avoir accès, de sorte que les fichiers trusted
a la permission de modifier les fichiers.
Je viens de résoudre le problème de la question originale en changeant les autorisations de fichiers à 755 de manière récursive, en utilisant Filezilla. Cliquez avec le bouton droit de la souris sur le dossier parent, en supposant qu'il s'agit d'une sorte de dossier général de dépôt de fichiers sur lequel il est possible de définir des autorisations 755, puis Attributs de fichier -> Valeur numérique -> 755, puis cochez "Récupérer dans les sous-répertoires". Cela prend quelques minutes pour se propager dans les sous-répertoires si vous avez beaucoup de fichiers. Puis réessayez.
Vous devez disposer des droits d'accès au système de fichiers pour créer le répertoire.
Exemple : Dans Ubuntu 10.04 apache (php) fonctionne en tant qu'utilisateur : www-data dans le groupe : www-data
Ce qui signifie que l'utilisateur www-data a besoin d'un accès pour créer le répertoire.
Vous pouvez essayer vous-même en utilisant : 'su www-data' pour devenir l'utilisateur www-data.
Comme solution rapide, vous pouvez faire : sudo chmod 777 mon_répertoire_parent
chmod 0777
donnera un accès en lecture et écriture au monde entier ! Vous ne devriez pas conseiller quelque chose comme ça. Cependant, le conseil avec le groupe d'utilisateurs est actuellement le meilleur ici :)
Si le monde entier a accès au système d'exploitation, oui. La meilleure solution serait : sudo chown www-data:www-data my_parent_dir
J'ai ce problème à l'instant, la meilleure solution que je puisse vous donner pour l'instant (malgré le fait que vous n'ayez inclus aucun de vos codes) serait :
- Vérifiez comment vous nommez votre dossier de destination, par exemple : nouveau_dossier (parfois, cela peut provoquer une erreur de permission car la plupart des hôtes n'autorisent pas les noms utilisant des tirets bas, des tirets, etc. à être créés au moment de l'exécution). Cela a fonctionné pour moi.
-
Si vous utilisez une commande récursive pour créer des sous-dossiers, n'oubliez pas de mettre 0755 (n'oubliez pas d'inclure 0 au début) à la commande mkdir, par exemple :
if(!file_exists($output)){ if (!mkdir($output, 0755, true)) {//0755 die('Failed to create folders...'); } }
Cela a également fonctionné pour moi à l'instant.
2 votes
Plate-forme/serveur web/système d'exploitation ?
2 votes
Vérifiez cette question : http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir J'avais le même problème et la réponse donnée ici a réglé mon problème. Si vous êtes sous Linux, la réponse concernant SELinux peut s'appliquer à vous.
0 votes
Essayez ceci, ça marche pour moi stackoverflow.com/a/12656964/7516620 Entrez la description du lien ici