У меня есть скрипт, который хранит файлы в каталоге. Функция создает новый каталог каждые 7 дней на основе текущей даты (2018> март> неделя 1,2,3 и т. Д.). Это работает фантастически, но мне нужно установить права доступа к каталогу 777, иначе я столкнусь с проблемами. Смотрите код ниже.
static function initStorageFileDirectory() {
$filepath = 'storage/';
$year = date('Y');
$month = date('F');
$day = date('j');
$week = '';
$mode = 0777;
if (!is_dir($filepath . $year)) {
//create new folder
mkdir($filepath[$mode] . $year);
}
if (!is_dir($filepath . $year . "/" . $month)) {
//create new folder
mkdir($filepath[$mode] . "$year/$month");
}
if ($day > 0 && $day <= 7)
$week = 'week1';
elseif ($day > 7 && $day <= 14)
$week = 'week2';
elseif ($day > 14 && $day <= 21)
$week = 'week3';
elseif ($day > 21 && $day <= 28)
$week = 'week4';
else
$week = 'week5';
if (!is_dir($filepath . $year . "/" . $month . "/" . $week)) {
//create new folder
mkdir($filepath[$mode] . "$year/$month/$week");
}
$filepath = $filepath . $year . "/" . $month . "/" . $week . "/";
return $filepath;
}
Как видите, я установил режим $. Вероятно, это не лучший способ сделать это: со вставленным [$ mode] он не может создать каталог вообще, но если я удаляю этот бит кода из mkdir ($ filepath …., он отлично работает.
mkdir($filepath[$mode] . $year);
Это не делает то, что вы думаете, что делает. Он принимает символ по индексу $mode
от $filepath
, добавляет $year
к нему и создает каталог в результате (без явной установки разрешений). поскольку $filepath
не содержит 512 символов (0777
511 в восьмеричном), $filepath[$mode]
возвращает пустую строку (с уведомлением «Смещение неинициализированной строки») и mkdir
пытается создать каталог в $year
,
mkdir
принимает несколько аргументов, вторым из которых является режим:
mkdir($filepath . $year, $mode);
Но mkdir
режим по умолчанию 0777
, так что, если права доступа к каталогу будут другими, ваш umask
мешает. Вы можете установить свой umask
позволять 0777
разрешений, но это проще и (возможно) безопаснее chmod
каталог после его создания:
mkdir($filepath . $year);
chmod($filepath . $year, $mode);
Папка хранения должна быть доступна для записи Apache.
Либо вы можете установить разрешение 777, либо передать владение папкой в apache. то есть, чо для пользователя apache
в ubuntu chown -R www-data: www-data storage /
Вы должны использовать shell_exec
функция php:
shell_exec('chmod -R 777 storage/');
shell_exec('chown -R www-data:www-data storage/');