Почему PHP не может создать каталог с разрешениями 777? - PullRequest
54 голосов
/ 22 октября 2010

Я пытаюсь создать каталог на своем сервере с помощью PHP с помощью команды:

mkdir("test", 0777);

Но он не дает полных разрешений, только эти:

rwxr-xr-x

Ответы [ 5 ]

134 голосов
/ 22 октября 2010

Режим изменяется в зависимости от вашего текущего umask, в данном случае 022.

Способ работы umask является вычитающим. Вы берете первоначальное разрешение, данное mkdir, и вычитаете umask, чтобы получить фактическое разрешение:

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

Если вы не хотите, чтобы это происходило, вам нужно временно установить umask на ноль, чтобы он не имел никакого эффекта. Вы можете сделать это с помощью следующего фрагмента:

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

Первая строка меняет umask на ноль, а предыдущий - на $oldmask. Вторая строка делает каталог, используя нужные разрешения и (теперь неактуальный) umask. Третья строка восстанавливает umask до первоначального значения.

См. Документацию PHP для umask и mkdir для получения более подробной информации.

13 голосов
/ 22 октября 2010

На создание файлов и каталогов влияет настройка umask.Вы можете создавать файлы с определенным набором разрешений, манипулируя umask следующим образом: -

$old = umask(0);
mkdir("test", 0777);
umask($old);
5 голосов
/ 01 марта 2018

Избегайте использования этой функции в многопоточных веб-серверах.После создания файла лучше изменить права доступа к файлу с помощью chmod ().

Пример:

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

mkdir($dir);
chmod($dir, $permit);
2 голосов
/ 22 октября 2010

Возможно, ваш umask настроен на исключение этих

1 голос
/ 07 декабря 2017

Для тех, кто пытался

mkdir('path', 777);

и это не сработало.

Это потому, что, по-видимому, 0, предшествующий файловому режиму, очень важен, что говорит chmod интерпретировать переданное число как восьмеричное вместо десятичного.

Ссылка

Ps.Это не решение вопроса, а лишь дополнение к принятому ответу

...