web-dev-qa-db-fra.com

Pourquoi ne peut pas PHP créer un répertoire avec 777 autorisations?

J'essaie de créer un répertoire sur mon serveur en utilisant PHP avec la commande:

mkdir("test", 0777);

Mais il ne donne pas toutes les autorisations, seulement celles-ci:

rwxr-xr-x
54
Sjwdavies

Le mode est modifié par votre umask actuel, qui est 022 dans ce cas.

Le fonctionnement de umask est soustractif. Vous prenez l'autorisation initiale donnée à mkdir et soustrayez umask pour obtenir l'autorisation réelle :

  0777
- 0022
======
  0755 = rwxr-xr-x.

Si vous ne voulez pas que cela se produise, vous devez mettre temporairement votre umask à zéro pour qu'il n'ait aucun effet. Vous pouvez le faire avec l'extrait de code suivant:

$oldmask = umask(0);
mkdir("test", 0777);
umask($oldmask);

La première ligne change le umask à zéro tout en stockant la précédente dans $oldmask. La deuxième ligne crée le répertoire en utilisant les autorisations souhaitées et (désormais sans objet) umask. La troisième ligne restaure le umask à ce qu'il était à l'origine.

Voir le PHP doco pour mask et mkdir pour plus de détails.

135
paxdiablo

La création de fichiers et de répertoires est affectée par le paramétrage de umask. Vous pouvez créer des fichiers avec un ensemble particulier d'autorisations en manipulant umask comme suit: -

$old = umask(0);
mkdir("test", 0777);
umask($old);
13
Steve Weet

Évitez d'utiliser cette fonction dans les serveurs Web multithread. Il est préférable de modifier les autorisations de fichier avec chmod () après avoir créé le fichier.

Exemple:

$dir = "test";
$permit = 0777;

mkdir($dir);
chmod($dir, $permit);
5

Probablement, votre mask est configuré pour exclure ceux

2

Pour ceux qui ont essayé

mkdir('path', 777);

et cela n'a pas fonctionné.

C'est parce que, apparemment, le 0 précédant le mode fichier est très important et indique à chmod d'interpréter le nombre passé comme un octal au lieu d'une décimale.

Référence

Ps. Ce n'est pas une solution à la question, mais seulement un complément à la réponse acceptée

1
Niket Pathak