Я пытаюсь создать каталог с функцией MKDIR PHP , но я получаю ошибку следующим образом : Warning: mkdir() [function.mkdir]: Permission denied in .... Как решить проблему?
Я пытаюсь создать каталог с функцией MKDIR PHP , но я получаю ошибку следующим образом : Warning: mkdir() [function.mkdir]: Permission denied in .... Как решить проблему?
Ответы:
Я знаю, что это старая ветка, но для нее нужен лучший ответ. Вам не нужно устанавливать разрешения на 777, это проблема безопасности, поскольку это дает доступ для чтения и записи всему миру. Возможно, ваш пользователь apache не имеет разрешений на чтение / запись в каталоге.
Вот что вы делаете в Ubuntu
Убедитесь, что все файлы принадлежат группе и пользователю Apache. В Ubuntu это группа www-data и пользователь
chown -R www-data:www-data /path/to/webserver/www
Затем разрешил всем членам группы www-data читать и писать файлы.
chmod -R g+rw /path/to/webserver/www
Теперь mkdir()функция php должна работать без возврата ошибок
/opt/lampp/htdocs/www/my-app/public/uploads... В основном то, что я пытаюсь сделать, - это каждый зарегистрированный пользователь загружать файлы в папку загрузки, а также создавать папки с альбомами (это будет сделано с помощью php) для хранения фотографий ..
Поздний ответ для людей, которые найдут это через Google в будущем. Я столкнулся с той же проблемой.
ПРИМЕЧАНИЕ: Я НА MAC OSX LION
Что происходит, так это то, что apache запускается от имени пользователя «_www» и не имеет прав на редактирование каких-либо файлов. Вы заметите, что НИКАКИЕ функции файловой системы не работают через php.
Как исправить:
Откройте окно поиска и в строке меню выберите «Перейти»> «Перейти к папке»> / private / etc / apache2.
теперь откройте httpd.conf
найти:
User _www
Group _www
изменить имя пользователя:
User <YOUR LOGIN USERNAME>
Теперь перезапустите apache, запустив этот терминал формы:
sudo apachectl -k restart
Если это все еще не работает, я сделал следующее, прежде чем я сделал это. Может быть связано.
Откройте терминал и выполните следующие команды: (обратите внимание, мои файлы веб-сервера находятся в / Library / WebServer / www. Изменяйте в соответствии с местоположением вашего веб-сайта)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_wwwи создать группу для вас и Apache. Создайте новую группу, скажем, позывной trusted, и включите _wwwв нее себя. Затем сделайте доверенным владельцем группы всех файлов в каталоге документов вашего сервера. Наконец, сделайте все, chmod g+rwxчто необходимо, только с файлами, к которым Apache должен получить доступ, чтобы у trustedгруппы было разрешение на редактирование файлов.
Ответы только по ссылкам не считаются хорошей практикой в StackOverflow, но рекомендации, приведенные здесь, как правило, НЕ следует выполнять.
Я хотел бы вернуться к этому замечательному ответу на аналогичный вопрос . Я цитирую:
Пожалуйста, перестаньте предлагать использовать 777. Вы делаете свой файл доступным для записи всем, что в значительной степени означает, что вы теряете всю безопасность, для которой была разработана система разрешений. Если вы предлагаете это, подумайте о последствиях, которые это может иметь на плохо настроенном веб-сервере: станет невероятно легко «взломать» веб-сайт, перезаписав файлы. Так что не надо.
Закрепить права доступа к директории вы пытаетесь создать каталог в .
Я знаю, что эта ветка старая, но, возможно, однажды это поможет кому-то.
Проблема, почему PHP говорит «Permission denied» для mkdir () - неправильный путь URL. Итак, чтобы исправить это, все, что вам нужно, это получить правильный путь. Я сделал это так:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
Для создания каталога у вас должны быть разрешения файловой системы.
Пример: в Ubuntu 10.04 apache (php) работает как пользователь: www-data в группе: www-data
Это означает, что пользователю www-data необходим доступ для создания каталога.
Вы можете попробовать это сами, используя: 'su www-data', чтобы стать пользователем www-data.
В качестве быстрого исправления вы можете сделать: sudo chmod 777 my_parent_dir
chmod 0777даст доступ для чтения и записи в мир! Ничего подобного советовать не стоит. Тем не менее, совет с группой пользователей в настоящее время здесь лучший :)
Что еще вы можете сделать, это зайти в: / etc / sudoers
Добавьте туда следующую строку, которая дает разрешение этому пользователю www-data ALL = (ALL: ALL) ALL Почему www-data? это потому, что apache работает под этим именем пользователя.
Если ваш пользователь другой, попробуйте имя пользователя ALL = (ALL: ALL) ALL
Это сработало для меня.
sudoersнапрямую, а войдите в систему как root и используйте visudoкоманду te : которая проверяет любые изменения, чтобы избежать ошибочных изменений, которые могут вызвать ошибки синтаксического анализа при загрузке файла sudoers, что может оставить вас бессильным (как и при отсутствии прав на изменить что-нибудь)
Поскольку вы используете Mac, вы можете добавить себя в группу _www (группа пользователей apache) на своем Mac:
sudo dseditgroup -o edit -a $USER -t user _www
и добавьте пользователя _www в группу wheel, которая, похоже, является тем, что Mac создает файлы как:
sudo dseditgroup -o edit -a _www -t user wheel
У меня есть эта проблема прямо сейчас, лучшее решение, которое я могу дать вам прямо сейчас (несмотря на то, что вы не включили никакой код) будет:
Если вы использовали рекурсивную команду для создания подпапок, не забудьте указать 0755 (не забудьте включить 0 в начале) в команду mkdir, например:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}Это тоже сработало для меня сейчас.
Если вы используете LINUX, сначала давайте проверим пользователя apache, поскольку в некоторых дистрибутивах он может быть другим:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
Допустим, результат - «http». Сделайте следующее, просто не забудьте изменить path_to_folder на путь к папкам:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
проверьте, не проблема ли это с umask
if (!function_exists('mkdir_r')) {
/**
* create directory recursively
* @param $dirName
* @param int $rights
* @param string $dir_separator
* @return bool
*/
function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
$dirs = explode($dir_separator, $dirName);
$dir = '';
$created = false;
foreach ($dirs as $part) {
$dir .= $part . $dir_separator;
if (!is_dir($dir) && strlen($dir) > 0) {
$created = mkdir($dir, $rights);
}
}
return $created;
}
}
if (!function_exists('ensure_dir')) {
/**
* ensure directory exist if not create
* @param $dir_path
* @param int $mode
* @param bool $use_mask
* @param int $mask
* @return bool
*/
function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
// set mask
$old_mask = $use_mask && $mask != null
? umask($mask)
: null;
try {
return is_dir($dir_path) || mkdir_r($dir_path, $mode);
} finally {
if ($use_mask && $old_mask != null) {
// restore original
umask($old_mask);
}
}
}
}
После установки ftp-сервера sudo apt-get install vsftpdвам нужно будет его настроить. Чтобы разрешить доступ для записи, вы должны отредактировать /etc/vsftpd.confфайл и раскомментировать
#write_enable=YES
строка, поэтому она должна читать
write_enable=YES
Сохраните файл и перезапустите vsftpdс sudo service vsftpd restart.
Для других параметров конфигурации обратитесь к этой документации илиman vsftpd.conf
Эта ошибка возникает, если вы используете неправильный путь.
Например:
Я использую систему ubuntu, и имя моей папки проекта - myproject
Предположим, у меня есть каталог myproject / public / report, и я хочу создать новую папку с именем orders
Тогда мне нужен весь путь, по которому существует мой проект. Вы можете получить путь командой PWD
Итак, мой корневой путь будет = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / myproject / public / report / Orders';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
Это сработает для вас !! Наслаждаться !!