PHP mkdir: проблема с отказом в разрешении

99

Я пытаюсь создать каталог с функцией MKDIR PHP , но я получаю ошибку следующим образом : Warning: mkdir() [function.mkdir]: Permission denied in .... Как решить проблему?

фолос
источник
2
Платформа / веб-сервер / операционная система?
Salman A
1
проверьте этот вопрос: http://stackoverflow.com/questions/13908722/php-unable-to-create-a-directory-with-mkdir У меня была такая же проблема, и ответ здесь просто устранил мою проблему. Если вы работаете в Linux, ответ о SELinux может относиться к вам.
Лукас Мадурейра
попробуйте, это работает для меня stackoverflow.com/a/12656964/7516620 введите описание ссылки здесь
Akshay Italiya

Ответы:

172

Я знаю, что это старая ветка, но для нее нужен лучший ответ. Вам не нужно устанавливать разрешения на 777, это проблема безопасности, поскольку это дает доступ для чтения и записи всему миру. Возможно, ваш пользователь apache не имеет разрешений на чтение / запись в каталоге.

Вот что вы делаете в Ubuntu

  1. Убедитесь, что все файлы принадлежат группе и пользователю Apache. В Ubuntu это группа www-data и пользователь

    chown -R www-data:www-data /path/to/webserver/www

  2. Затем разрешил всем членам группы www-data читать и писать файлы.

    chmod -R g+rw /path/to/webserver/www

Теперь mkdir()функция php должна работать без возврата ошибок

простой двигатель
источник
3
Хороший ответ! Надеюсь, со временем это попадет в начало страницы!
Очень Нерегулярный
18
Это очень плохая идея .
Big McLargeHuge 05
Apache действительно требуется разрешение на запись таких вещей, как кеш и журналы ... это просто вопрос тонкой настройки.
Manatax
@simpleengine Привет, я заметил ваш ответ ... У меня такая же проблема с проектом, который я пытаюсь создать в CodeIgnter и разрабатываю в Ubuntu 14.14 Lts. Не могли бы вы объяснить мне более подробно шаги, которые мне нужны сделать для того, чтобы исправить эту ошибку ??? Чтобы дать вам дополнительную информацию: абсолютный путь /opt/lampp/htdocs/www/my-app/public/uploads... В основном то, что я пытаюсь сделать, - это каждый зарегистрированный пользователь загружать файлы в папку загрузки, а также создавать папки с альбомами (это будет сделано с помощью php) для хранения фотографий ..
ltdev
6
Мне не нравятся пользователи, которые продолжают говорить «это небезопасно», не показывая, как это безопасно сделать.
че-азе
38

Поздний ответ для людей, которые найдут это через 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/*
Крис Ингис
источник
6
Это решение работает, но позволяет Apache нанести ущерб вашей системе, если кто-то заставит ее выполнить вредоносный код (например, через эксплойт Shellshock). Альтернативой было бы оставить Apache работающим от имени _wwwи создать группу для вас и Apache. Создайте новую группу, скажем, позывной trusted, и включите _wwwв нее себя. Затем сделайте доверенным владельцем группы всех файлов в каталоге документов вашего сервера. Наконец, сделайте все, chmod g+rwxчто необходимо, только с файлами, к которым Apache должен получить доступ, чтобы у trustedгруппы было разрешение на редактирование файлов.
Крис Миддлтон
3
просто вмешиваюсь, чтобы еще раз подчеркнуть, что этот ответ - плохая идея. есть много очень веских причин, по которым процессы apache принадлежат их собственному пользователю специального назначения.
danyamachine
16

Не устанавливайте разрешения на 777 при использовании mkdir в PHP

Ответы только по ссылкам не считаются хорошей практикой в ​​StackOverflow, но рекомендации, приведенные здесь, как правило, НЕ следует выполнять.

Я хотел бы вернуться к этому замечательному ответу на аналогичный вопрос . Я цитирую:

Пожалуйста, перестаньте предлагать использовать 777. Вы делаете свой файл доступным для записи всем, что в значительной степени означает, что вы теряете всю безопасность, для которой была разработана система разрешений. Если вы предлагаете это, подумайте о последствиях, которые это может иметь на плохо настроенном веб-сервере: станет невероятно легко «взломать» веб-сайт, перезаписав файлы. Так что не надо.

Уилт
источник
9

Закрепить права доступа к директории вы пытаетесь создать каталог в .

Эрик
источник
Я просто решил проблему в исходном вопросе, рекурсивно изменив права доступа к файлу на 755, используя Filezilla. Щелкните правой кнопкой мыши родительскую папку, предполагая, что это какая-то общая папка репозитория файлов, для которой можно установить права доступа 755, затем Атрибуты файла -> Числовое значение -> 755, затем отметьте «Рекурсия в подкаталоги». Распространение по подкаталогам занимает пару минут, если у вас много файлов. Затем попробуйте еще раз.
TARKUS
7

Я знаю, что эта ветка старая, но, возможно, однажды это поможет кому-то.

Проблема, почему PHP говорит «Permission denied» для mkdir () - неправильный путь URL. Итак, чтобы исправить это, все, что вам нужно, это получить правильный путь. Я сделал это так:

<?php

$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';

if( !file_exists($dir) ) {
    mkdir($dir, 0755, true);
}

?>
Борис
источник
1
Произошло у меня при переходе на новый хост (у которого есть mysqlnd lol). Я забыл перейти на новый полный путь к домашнему каталогу. Оказывается, это не проблема с разрешением.
JSG
2

Для создания каталога у вас должны быть разрешения файловой системы.

Пример: в Ubuntu 10.04 apache (php) работает как пользователь: www-data в группе: www-data

Это означает, что пользователю www-data необходим доступ для создания каталога.

Вы можете попробовать это сами, используя: 'su www-data', чтобы стать пользователем www-data.

В качестве быстрого исправления вы можете сделать: sudo chmod 777 my_parent_dir

Джон Скарпетейг
источник
14
chmod 0777даст доступ для чтения и записи в мир! Ничего подобного советовать не стоит. Тем не менее, совет с группой пользователей в настоящее время здесь лучший :)
KingCrunch
1
Если у мира есть доступ к ОС, конечно. Лучшим способом было бы: sudo chown www-data: www-data my_parent_dir
Джон Скарпетиг
Или оставьте разрешения в покое и добавьте www-данные в группу родительского каталога.
Marc B
0

Что еще вы можете сделать, это зайти в: / etc / sudoers

Добавьте туда следующую строку, которая дает разрешение этому пользователю www-data ALL = (ALL: ALL) ALL Почему www-data? это потому, что apache работает под этим именем пользователя.

Если ваш пользователь другой, попробуйте имя пользователя ALL = (ALL: ALL) ALL

Это сработало для меня.

Максвеллс
источник
5
не редактируйте sudoersнапрямую, а войдите в систему как root и используйте visudoкоманду te : которая проверяет любые изменения, чтобы избежать ошибочных изменений, которые могут вызвать ошибки синтаксического анализа при загрузке файла sudoers, что может оставить вас бессильным (как и при отсутствии прав на изменить что-нибудь)
Элиас Ван Отегем
Как найти имя пользователя. как www-data? Я использую nginx, но не работаю
robspin 05
1
@robspin попробуйте это: ps aux | egrep '(nginx)'
maxwells
0

Поскольку вы используете 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
SeanJA
источник
0

У меня есть эта проблема прямо сейчас, лучшее решение, которое я могу дать вам прямо сейчас (несмотря на то, что вы не включили никакой код) будет:

  1. Проверьте, как вы называете свою папку назначения, например: new_folder (иногда это может вызвать ошибку при разрешении, поскольку большинство хостов не позволяют создавать имена с использованием подчеркивания, тире и т. Д. Во время выполнения). У меня это сработало.
  2. Если вы использовали рекурсивную команду для создания подпапок, не забудьте указать 0755 (не забудьте включить 0 в начале) в команду mkdir, например:

    if(!file_exists($output)){
        if (!mkdir($output, 0755, true)) {//0755
            die('Failed to create folders...');
        }
    
    }

Это тоже сработало для меня сейчас.

Арунгишьяди
источник
3
777 - проблема безопасности
MaicolBen
Отредактировано только что, на
0755
0

Если вы используете 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
Марсело Агимовель
источник
0

проверьте, не проблема ли это с 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);
            }
        }
    }
}
ceph3us
источник
0

После установки ftp-сервера sudo apt-get install vsftpdвам нужно будет его настроить. Чтобы разрешить доступ для записи, вы должны отредактировать /etc/vsftpd.confфайл и раскомментировать

#write_enable=YES

строка, поэтому она должна читать

write_enable=YES

Сохраните файл и перезапустите vsftpdс sudo service vsftpd restart.

Для других параметров конфигурации обратитесь к этой документации илиman vsftpd.conf

мое солнце
источник
0

Эта ошибка возникает, если вы используете неправильный путь.

Например:

Я использую систему 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);
}

Это сработает для вас !! Наслаждаться !!

Уманг Сони
источник