Почему PHP не может создать каталог с разрешениями 777?

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

mkdir("test", 0777);

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

rwxr-xr-x

person Sjwdavies    schedule 22.10.2010    source источник


Ответы (6)


Режим изменяется вашим текущим 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 для более подробной информации.

person paxdiablo    schedule 22.10.2010
comment
вы вылечили мою головную боль добрый сэр - person electrikmilk; 04.06.2021

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

$old = umask(0);
mkdir("test", 0777);
umask($old);
person Steve Weet    schedule 22.10.2010

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

Пример:

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

mkdir($dir);
chmod($dir, $permit);
person Stanislav Malomuzh    schedule 01.03.2018

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

mkdir('path', 777);

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

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

Справочник

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

person Niket Pathak    schedule 07.12.2017
comment
Чтобы было ясно, chmod не делает никакой специальной интерпретации... PHP анализирует 0xxx как восьмеричное представление, функция, которая работает везде, даже в обычных функциях: echo max(050, 24); // echos 40, which is what 050 is - person Christian; 02.06.2018

Вероятно, ваш umask настроен на исключение

person The Archetypal Paul    schedule 22.10.2010

В моем случае я должен использовать следующий способ для centos7, который решил проблему

$oldmask = umask(000);//it will set the new umask and returns the old one 
mkdir("test", 0777);
umask($oldmask);//reset the old umask

Более подробную информацию можно найти по адресу https://www.php.net/manual/en/function.umask.php

person Mahesh Hegde    schedule 08.12.2019