Отказано в доступе к mkdir()

Я получаю следующую ошибку при попытке вызвать mkdir() на сервере...

Предупреждение: mkdir() [function.mkdir]: доступ запрещен в /home/server/public_html/wp-content/themes/mytheme/catimages/cat-images.php в строке 373.

Функция ниже. Он пытается создать папку в «папке wp-content/uploads» сайта. Я проверил, что версия PHP 5.2.15 и что файлы внутри папки темы доступны для записи, но это не обязательно означает, что папка загрузки доступна для записи, я полагаю.

Как узнать, доступна ли для записи папка uploads?

protected function category_images_base_dir()
{
    // Where should the dir be? Get the base WP uploads dir
    $wp_upload_dir = wp_upload_dir();
    $base_dir = $wp_upload_dir[ 'basedir' ];
    // Append our subdir
    $dir = $base_dir . '/cat-images';
    // Does the dir exist? (If not, then make it)
    if ( ! file_exists( $dir ) ) {
        mkdir( $dir ); //THIS IS LINE 373
    }
    // Now return it
    return $dir;
}

person Scott B    schedule 10.02.2011    source источник
comment
Возможно, вам придется установить флаг resurice mkdir;)   -  person NikiC    schedule 10.02.2011
comment
:) это на самом деле смешно: как вы можете узнать? -> вы получаете предупреждение: ... Отказано в доступе ..., поэтому вы точно знаете, что папка недоступна для записи пользователем веб-сервера. если у вас есть доступ по ssh, выполните chmod -R 777 /home/server/public_html/wp-content, если у вас нет доступа по ssh, вы можете открыть свой любимый ftp-клиент, перейдите в папку wp-content и щелкните правой кнопкой мыши. на wp-content, и большинство ftp-клиентов будут иметь вкладку или поле разрешений где-то там, где вы будете использовать их для изменения разрешений.   -  person Poelinca Dorin    schedule 10.02.2011
comment
@poelinca Если бы я мог, я бы понизил это. Вы серьезно предлагаете сделать его каталоги общедоступными, чтобы проблема исчезла?!   -  person Linus Kleen    schedule 10.02.2011
comment
@Linus Kleen: его файлы wp-content уже доступны для чтения во всем мире, без вопросов. Они не доступны для записи, да, и, судя по всему, ему нужен доступ для записи некоторых файлов, как бы вы это сделали? вы проверяете, доступна ли папка для записи, и если нет, вы больше не записываете файл? это решение? Вы правы, это должно было быть chmod -R 777 /home/server/public_html/wp-content/uploads или даже лучше chown -R "webserveruser" /home/server/public_html/wp-content/uploads   -  person Poelinca Dorin    schedule 11.02.2011
comment
@poelinca: это правильный вариант использования групповых привилегий - вы по-прежнему владеете каталогом (и файлами), но вы разрешаете доступ пользователям из другой группы. 777, вероятно, избыточно; Передача права собственности пользователю сервера может доставить вам проблемы, когда вам нужно управлять файлами (удалять старые и т. д.).   -  person Piskvor left the building    schedule 11.02.2011
comment
@Piskvor: вы абсолютно правы, однако большинство хостинговых компаний не разрешают доступ по ssh, они ничего не говорят вам о группах, кроме пользователей веб-сервера, вам, вероятно, нужно позвонить им или отправить билеты, а затем подождать, пока они это сделают, поэтому я рекомендовал 777 в первую очередь.   -  person Poelinca Dorin    schedule 11.02.2011
comment
@poelinca: Действительно, при таком подходе несколько часов, потраченных на программирование, сэкономят вам десять минут разговоров по телефону.   -  person Piskvor left the building    schedule 11.02.2011


Ответы (2)


is_writable(), вероятно, функция, которую вы ищете.

http://cz.php.net/manual/en/function.is-writable.php говорит:

Возвращает TRUE, если имя файла существует и доступно для записи. Аргумент имени файла может быть именем каталога, позволяющим проверить, доступен ли каталог для записи.

Кроме того, здесь актуальна непосредственно следующая строка:

Имейте в виду, что PHP может обращаться к файлу как идентификатор пользователя, от имени которого работает веб-сервер (часто «никто»).

Другими словами, проверьте, доступен ли для записи в ваш каталог идентификатор пользователя веб-сервера — это может быть другой идентификатор пользователя, чем ваш! Установите соответствующие разрешения - например. установите группу пользователей папки на группу пользователей сервера и предоставьте группе права на чтение, запись и выполнение. (chgrp somegroup uploads; chmod g+r uploads; chmod g+w uploads; chmod g+x uploads)

person Piskvor left the building    schedule 10.02.2011
comment
Спасибо за отличный ответ. Я собираюсь вставить несколько дополнительных проверок кода, чтобы проверить состояние is_writable() родительской папки и добавить обработку исключений в этом событии. - person Scott B; 11.02.2011

Убедитесь, что родительская папка доступна для записи процессу, от имени которого работает веб-сервер.

Редактировать: Упс, преждевременный ответ. Ваш хост предоставляет вам файловый браузер с графическим интерфейсом?

person Alex Howansky    schedule 10.02.2011