Я не могу понять, почему я должен использовать 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, если вы подключаетесь к другому пользователю.