Я намагаюся створити каталог з функцією MKDIR PHP , але я отримую помилку наступним чином : Warning: mkdir() [function.mkdir]: Permission denied in .... Як вирішити проблему?
Я намагаюся створити каталог з функцією MKDIR PHP , але я отримую помилку наступним чином : Warning: mkdir() [function.mkdir]: Permission denied in .... Як вирішити проблему?
Відповіді:
Я знаю, що це стара тема, але на неї потрібна краща відповідь. Вам не потрібно встановлювати дозволи на 777, це проблема безпеки, оскільки вона надає доступ для читання та запису до світу. Можливо, ваш користувач apache не має дозволів на читання / запис у каталозі.
Ось що ви робите в Ubuntu
Переконайтесь, що всі файли належать групі та користувачеві Apache. В Ubuntu це www- група даних та користувач
chown -R www-data:www-data /path/to/webserver/www
Далі дозволило всім членам групи даних www читати та писати файли
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 каже "Дозвіл відмовлено" для 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-дані потрібен доступ для створення каталогу.
Ви можете спробувати це самостійно, використовуючи: 'su www-data', щоб стати користувачем www-даних.
Для швидкого виправлення ви можете зробити: 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, що може залишити вас безсилим (як і відсутність прав на що-небудь змінити)
У мене ця проблема зараз, найкращим рішенням, яке я можу дати вам зараз (незважаючи на те, що ви не включили жодного свого коду), було б:
Якщо ви використовували рекурсивну команду для створення підпапок, не забудьте поставити 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 / відкритий / звіт каталогу існують і хочете створити нову папку з ім'ям замовлення
Тоді мені потрібен цілий шлях, де існує мій проект. Ви можете отримати шлях за допомогою команди PWD
Отже, моїм кореневим шляхом буде = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / myproject / public / report / Orders';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
Це буде працювати у вас !! Насолоджуйтесь !!