Я пытаюсь создать каталог на своем сервере с помощью PHP с помощью команды:
mkdir("test", 0777);
Но он не дает полных разрешений, только эти:
rwxr-xr-x
Я пытаюсь создать каталог на своем сервере с помощью PHP с помощью команды:
mkdir("test", 0777);
Но он не дает полных разрешений, только эти:
rwxr-xr-x
Режим изменяется вашим текущим 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 для более подробной информации.
На создание файлов и каталогов влияет настройка umask. Вы можете создавать файлы с определенным набором разрешений, манипулируя umask следующим образом:
$old = umask(0);
mkdir("test", 0777);
umask($old);
Избегайте использования этой функции на многопоточных веб-серверах. Лучше изменить права доступа к файлу с помощью chmod() после создания файла.
Пример:
$dir = "test";
$permit = 0777;
mkdir($dir);
chmod($dir, $permit);
Для тех, кто пытался
mkdir('path', 777);
и это не сработало.
Это потому, что, по-видимому, 0, предшествующий файловому режиму, очень важен, что говорит chmod интерпретировать переданное число как восьмеричное, а не десятичное.
Пс. Это не решение вопроса, а лишь дополнение к принятому ответу
chmod не делает никакой специальной интерпретации... PHP анализирует 0xxx как восьмеричное представление, функция, которая работает везде, даже в обычных функциях: echo max(050, 24); // echos 40, which is what 050 is
- person Christian; 02.06.2018
В моем случае я должен использовать следующий способ для 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