Разрешения с 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); } 

Да, это из-за 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);

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

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

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

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

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

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

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

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