Подтвердить что ты не робот

Разрешения с mkdir не будут работать

Я не могу понять, почему я должен использовать chmod для получения правильных разрешений. Файл создается успешно, но с 0755, а не 0775, который я указываю в mkdir.

(http://php.net/manual/en/function.mkdir.php)

Мне нужно сделать chmod после mkdir, чтобы установить правильные разрешения.

Безопасный режим отключен в php.ini, и папка принадлежит группе php и владельцу (www-data)

Это не работает:

  if(!is_dir("/var/www/customers/$username/$project_name")) 
  {
    mkdir("/var/www/customers/$username/$project_name",0775);

  }

Но это делает:

  if(!is_dir("/var/www/customers/$username/$project_name")) 
  {
    mkdir("/var/www/customers/$username/$project_name");
    chmod("/var/www/customers/$username/$project_name",0775);

  }
4b9b3361

Ответ 1

Да, это из-за umask...

из комментариев документов: http://php.net/manual/en/function.mkdir.php

Вы можете заметить, что при создании новый каталог с использованием этого кода:

mkdir ($ dir, 0777);

Созданная папка фактически имеет разрешений 0755, вместо указанный 0777. Почему вы спрашиваете? Из-за umask(): http://www.php.net/umask

Значение по умолчанию umask по умолчанию на моей установке, составляет 18. Который 22 восьмеричный, или 0022. Это означает, что при использовании mkdir() для CHMOD созданная папка для 0777, PHP занимает 0777 и вычитает текущее значение umask, в нашем случае 0022, поэтому результат 0755 - который не то, что вы хотели, вероятно.

"Исправить" для этого просто, включите эта строка:

$old_umask = umask (0);

Перед созданием папки с mkdir(), чтобы иметь фактическое значение для вас положить как CHMOD. Если бы вы как возвратить umask к его оригинальному когда вы закончите, используйте это:

Umask ($ old_umask);

Ответ 2

Я думаю, вам, возможно, придется изменить свой umask.

Как отмечено на man-странице mkdir:

Режим также изменяется текущей umask, которую вы можете изменить с помощью umask().

Теперь, смотря на man-страницу umask(), один из перечисленных комментариев подтверждает мою внутреннюю мысль:

"Лучше изменить права доступа к файлу с помощью chmod() после создания файла."

Другими словами, я считаю, что способ, которым вы это делаете, более безопасен:

Задайте свой umask, чтобы файлы были созданы для вашего пользователя, затем используйте chmod, чтобы открыть их.

Ответ 3

Попробуйте вызвать эту функцию, прежде чем создавать каталог: clearstatcache(); Кроме того, возможно, вам стоит проверить, если вы можете сделать это, используя только mkdir, если вы подключаетесь к другому пользователю.