mkdir() создает 0755 вместо 0775

У меня есть следующий код:

function makedirs($dirpath, $mode = 0775, $recursive = true) {
    return is_dir($dirpath) || mkdir($dirpath, $mode, $recursive);
}

$dir = 'path/to/folder/';

makedirs($dir, 0775);

Проблема в том, что даже при передаче 0775 или чего-либо еще в качестве параметра для $mode, mkdir() создает папки разрешений 0755.

Например код предварительного просмотра вернет:

  • путь/ (0755)
  • to/ (0755)
  • папка/ (0755)

person Machado    schedule 20.04.2016    source источник
comment
Проверьте значение umask. вы можете ввести umask в оболочке, чтобы узнать значение маски. Я предполагаю, что ваше значение umask равно 022   -  person user3425867    schedule 20.04.2016
comment
$dir = 'path/to/folder/' makedirs($dir, 0775) это неполно, если это то, что вы действительно используете. Если это псевдокод, укажите правильный синтаксис.   -  person Funk Forty Niner    schedule 20.04.2016
comment
$mode = 0775 ведущий нуль, вероятно, рассматривается как восьмеричный, кстати, из-за пользовательской функции. Попробуйте процитировать его и то же самое для внутреннего makedirs($dir, 0775).   -  person Funk Forty Niner    schedule 20.04.2016
comment
что показывает var_dump();?   -  person Funk Forty Niner    schedule 20.04.2016
comment
@ Fred-ii - папка, которую я использую, не имеет значения, функция успешно создает папку и записывает в нее некоторые файлы. Вопрос в разрешениях. (Обратите внимание, что вы, вероятно, захотите указать режим в виде восьмеричного числа, что означает, что он должен иметь начальный ноль. - php.net/manual/en/function.mkdir.php)   -  person Machado    schedule 20.04.2016
comment
Может быть актуально: stackoverflow.com/questions/25104990/   -  person Charlotte Dunois    schedule 20.04.2016
comment
@Fred-ii- var_dump(makedirs($dir, 0775)) возвращает логическое значение true.   -  person Machado    schedule 20.04.2016
comment
у вас есть ответ ниже, чтобы проконсультироваться тогда. О, и я думал, что использование пользовательской функции будет проблемой, поэтому я сказал, что @Machado   -  person Funk Forty Niner    schedule 20.04.2016
comment
Хорошо, я тоже, но из-за синтаксиса восьмеричного числа все равно спасибо @ Fred-ii-   -  person Machado    schedule 20.04.2016
comment
Всегда пожалуйста @Machado рад видеть, что все получилось, ура   -  person Funk Forty Niner    schedule 20.04.2016


Ответы (1)


Вы можете сделать следующее

function makedirs($dirpath, $mode = 0775, $recursive = true) {
    $oldMask=umask(002);
    $status = is_dir($dirpath) || mkdir($dirpath, $mode, $recursive);
    umask($oldMask);
    return $status;
}

$dir = 'path/to/folder/'
makedirs($dir, 0775);

Примечание. Хотя вы можете использовать umask(0), чтобы разрешить даже разрешения 777, это не рекомендуется, так как это может создать проблемы с безопасностью.

Изменить

Попробуйте установить систему значений umask для всех пользователей или для себя, чтобы удалить код umask из php. Хотя приведенный выше код будет работать, установка umask в php-скриптах не рекомендуется.

Согласно странице руководства PHP

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

Вы можете настроить umask в файле /etc/bashrc или /etc/profile для всех пользователей. По умолчанию в большинстве дистрибутивов Linux для него установлено значение 0022 (022) или 0002 (002). Откройте файл /etc/profile или ~/.bashrc, введите:

# vi /etc/profile

OR

$ vi ~/.bashrc

Добавьте/измените следующую строку, чтобы настроить новый umask: umask 022

Сохраните и закройте файл. Изменения вступят в силу после следующего входа в систему. Все пользователи UNIX могут переопределить системные значения umask по умолчанию в своем файле /etc/profile, файле ~/.profile (оболочка Korn/Bourne), файле ~/.cshrc (оболочка C), ~/.bash_profile (оболочка Bash) или ~/.login файл (определяет среду пользователя при входе в систему).

Источник http://www.cyberciti.biz/tips/understanding-linux-unix-umask-value-usage.html

person user3425867    schedule 20.04.2016
comment
ваш комментарий о umask привел меня сюда: php.net/manual/en/function.umask. php, где первый пример объясняет ваш ответ и может быть полезен другим. - person Machado; 20.04.2016
comment
Имеет смысл использовать chmod. Возможно, вам все же придется установить значение umask вашей системы на 002 хотя бы один раз. Вы можете настроить umask в файле /etc/bashrc или /etc/profile для всех пользователей. - person user3425867; 20.04.2016
comment
Что ж, теперь я использую chmod() после mkdir(), чтобы дать папке нужные разрешения по соображениям безопасности. - person Machado; 20.04.2016