Я пытаюсь создать каталог с функцией PHP mkdir, но я получаю сообщение об ошибке следующим образом: Warning: mkdir() [function.mkdir]: Permission denied in ...
. Как решить проблему?
PHP mkdir: проблема с разрешением отказа
Ответ 1
Я знаю, что это старый поток, но ему нужен лучший ответ. Вам не нужно устанавливать разрешения для 777, это проблема безопасности, поскольку она дает доступ для чтения и записи в мир. Возможно, ваш пользователь Apache не имеет прав на чтение и запись в каталоге.
Вот что вы делаете в Ubuntu
-
Убедитесь, что все файлы принадлежат группе Apache и пользователю. В Ubuntu это www-datastrong > группа и пользователь
chown -R www-data:www-data /path/to/webserver/www
-
Затем все участники группы www-data включили чтение и запись файлов
chmod -R g+rw /path/to/webserver/www
Теперь функция php mkdir()
должна работать без ошибок
Ответ 2
Поздний ответ для людей, которые находят это через Google в будущем. Я столкнулся с той же проблемой.
ПРИМЕЧАНИЕ: Я ЕСМЬ на MAC OSX LION
Что происходит, так это то, что apache запускается как пользователь "_www" и не имеет прав на редактирование каких-либо файлов. Вы заметите, что никакие функции файловой системы не работают через php.
Как исправить:
Откройте окно поиска и в строке меню выберите Go > Go To Folder > /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/*
Ответ 3
Не устанавливайте разрешения для 777 при использовании mkdir в PHP
Связывание только ответов не считается хорошей практикой в StackOverflow, но рекомендации, которые приводятся здесь, обычно НЕ следует отслеживать.
Я бы хотел вернуться к этому замечательному ответу по аналогичному вопросу. Я цитирую:
Пожалуйста, прекратите предлагать использовать 777. Вы делаете свой файл доступным для записи всем, что в значительной степени означает, что вы потеряете всю безопасность, для которой была создана система разрешений. Если вы предложите это, подумайте о последствиях, которые могут иметь последствия для плохо настроенного веб-сервера: стало бы невероятно легко "взломать" веб-сайт, перезаписав файлы. Итак, не надо.
Ответ 4
Исправьте права каталога, в котором вы пытаетесь создать каталог.
Ответ 5
Я знаю, что эта ветка старая, но, возможно, однажды это кому-нибудь поможет.
Проблема, почему PHP говорит "Отказано в доступе" для mkdir() - неверный путь URL. Итак, чтобы исправить это, все, что вам нужно, чтобы получить правильный путь. Я сделал это так:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
$old = umask(0);
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
umask($old);
?>
Ответ 6
Для создания каталога необходимо иметь разрешение файловой системы.
Пример: в Ubuntu 10.04 apache (php) выполняется как пользователь: www-данные в группе: www-datap >
Значение пользовательских www-данных требует доступа для создания каталога.
Вы можете попробовать это самостоятельно, используя: 'su www-data', чтобы стать пользователем www-data.
В качестве быстрого исправления вы можете: sudo chmod 777 my_parent_dir
Ответ 7
Что еще вы можете сделать, это перейти к:/etc/sudoers
Добавьте следующую строку, которая дает разрешение этому пользователю www-data ALL = (ВСЕ: ВСЕ) ВСЕ Почему www-данные? это связано с тем, что apache работает под этим именем пользователя.
Если ваш пользователь отличается, попробуйте имя пользователя ALL = (ВСЕ: ВСЕ) ВСЕ
Это сработало для меня.
Ответ 8
У меня есть эта проблема только сейчас, мое лучшее решение, которое я могу дать вам прямо сейчас (несмотря на то, что вы не включили ни один из вашего кода) будет:
- Проверьте, как вы называете папку назначения, например: new_folder (иногда это может привести к ошибке разрешения, поскольку большинство хостов не позволяют создавать имена, использующие подчеркивание, тире и т.д., Во время выполнения). Это сработало для меня.
Если вы использовали рекурсивную команду для создания подпапок, не забудьте поставить 0755 (не забудьте включить 0 в начале) в команду mkdir, например:
if(!file_exists($output)){ if (!mkdir($output, 0755, true)) {//0755 die('Failed to create folders...'); } }
Это также работает для меня только сейчас.
Ответ 9
Поскольку вы находитесь на Mac, вы можете добавить себя в группу _www (группа пользователей apache) на своем mac:
sudo dseditgroup -o edit -a $USER -t user _www
и добавьте пользователя _www в группу колес, которая, по-видимому, является тем, что mac создает файлы как:
sudo dseditgroup -o edit -a _www -t user wheel
Ответ 10
Если вы используете 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
Ответ 11
проверьте, не проблема ли с 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);
}
}
}
}
Ответ 12
После установки ftp-сервера с sudo apt-get install vsftpd
вам придется его настроить. Чтобы включить доступ для записи, вы должны отредактировать файл /etc/vsftpd.conf
и раскомментировать
#write_enable=YES
строка, поэтому следует читать
write_enable=YES
Сохраните файл и перезапустите vsftpd
с помощью sudo service vsftpd restart
.
Для других параметров конфигурации обратитесь к этой документации или man vsftpd.conf