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

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

Ответ 1

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

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

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

    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-data​​p >

Значение пользовательских www-данных требует доступа для создания каталога.

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

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

Ответ 7

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

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

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

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

Ответ 8

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

  1. Проверьте, как вы называете папку назначения, например: new_folder (иногда это может привести к ошибке разрешения, поскольку большинство хостов не позволяют создавать имена, использующие подчеркивание, тире и т.д., Во время выполнения). Это сработало для меня.
  2. Если вы использовали рекурсивную команду для создания подпапок, не забудьте поставить 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