Створити папку за допомогою PHP. Директива safe_mode = on, mkdir та вирішення проблем створення папок на сервері. Приклади використання функції mkdir

02.04.2020 Безпека

У PHP є єдина функція - mkdir(), яка дозволяє створювати на сервері сайту директорії, які часом необхідні в господарстві. Наприклад, при створенні нового матеріалу вам необхідно створити під нього папку, куди знову ж таки засобами вашої CMS ви заливатимете всі необхідні файли.

Mkdir("/path/to/my/dir", 0700);

Тобто. у певній директорії ми створюємо нову папкуі наприклад задаємо їй режим mode 0700, наприклад, щоб у папку можна було записувати файли режим mode змінюємо на 0777.

Але ось тут і виникає проблема з mkdir(). При виконанні цього php скрипта при включеній функції сервера safe_mode відбувається перевірка власника (UID) і якщо не збігається власник скрипта та папки, то можливо ви не зможете, наприклад, записати файл у створену директорію, видалити файл у ній або, наприклад, через FTP у вас не вдасться видалити саму папку.

Але є більш витончене вирішення цієї проблеми, без необхідності просити хостера вимкнути вам функцію safe_mode ( дана функціявключена абсолютно на всіх хостингах за умовчанням, з метою забезпечення безпеки). В основі своїй платні хостингинадають і доступ до ftp, саме від цього ми і відштовхуватимемося.

$conn_ftp = @ftp_connect("your_ftp_server", 21, 5);

Перша змінна в функції це адреса вашого ftp сервера, друга порт, яким ви з'єднуєтеся з ftp і остання це допустимий тайм-аут з'єднання. Трохи про таймаут, він необхідний для наступних мережевих операцій, якщо його не вводити, то ставиться значення за замовчуванням 90 секунд. Після з'єднання ми перевіряємо чи пройшло воно успішно і відправляємо логін та пароль:

If($conn_ftp) // з'єднання пройшло успішно ($login_result = @ftp_login($conn_ftp, "user", "pass"); // вводимо свої логін і пароль для FTP if($login_result) // перевірка логіна та пароля пройшла успішно ( ftp_pasv ($conn_ftp, TRUE); ) )

Після перевірки логіну та пароля нам необхідно визначитися з пасивним режимом і виставити йому значення TRUE або FALSE - це необхідно, якщо подальші функції FTP працюватимуть неправильно. Тепер після визначення пасивного режиму ми можемо створювати наші папки, я опишу всі функції, які можуть стати вам у нагоді:

$file = ftp_mkdir ($conn_ftp, "public_html/materials/345"); //Створення директорії 345 в папці materials, якщо папки materials не існує, //то вона так само буде створена, так само і з папкою public_html (дана директорія //вказана для того, щоб ви бачили весь шлях, а так це просто папка із сайтом) ftp_chdir ($conn_ftp, "public_html/materials"); //Якщо у вас точно є папка materials, то вам не обов'язково прописувати весь //шлях, можна просто спочатку в неї перейти і потім у ній створити папку 345 використовуючи //наступний код ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $ file); //Усі стандартні папки створюються з режимом mode 0755, дана командадозволить змінити //його на 0777, що дозволить вам заносити файли в створену папку.

Тепер наведу повний приклад робочого коду, щоб ви побачили, як все це виглядає, наприклад у мене:

$dir_name = time(); //Тут створюю ім'я папки за часом запуску скрипта $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // з'єднання пройшло успішно ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // вводимо свої логін і пароль для FTP if($login_result) // перевірка логіна та пароля пройшла успішно ( ftp_pasv ($conn_ftp, TRUE); ftp_chdir ($conn_ftp, "public_html/materials"); ftp_mkdir ($conn_ftp, $dir_name); ftp_chmod($conn_ftp, 0777, $dir_name); ) )

Варто сказати трохи про вказівку директорій при створенні, якщо ви вкажете на початку слеш, то папка буде створюватися щодо кореня ftp. При підключенні до серверу FTPви завжди підключаєтеся до кореня, тому врахуйте цей момент.

Функція mkdir() створює нову папку у вказаній директорії. Якщо створення відбувається успішно, повертає значення True. Під час створення нової папки можна встановити права доступу до неї параметром $mode. Вказавши параметр $recursive значення True, можна створити кілька вкладених папок.

Версія PHP 4 та вище.

function bool mkdir(string $pathname [, int $mode [, bool $recursive [, resource $context]]])

Параметри функції mkdir

$ pathnameШлях до створюваної директорії.
$modeПрава на створювану папку.Права призначаються вісімковим значенням з обов'язковим нулем на першому місці (0777). Крім першого нуля, числа означають рівні доступу для власника, групи власника, всім інших.
Рівень доступу визначається за кількістю:
0 – доступ закритий;
1 – доступ до читання;
2 – доступ до запис;
4 – доступ виконання.
Найчастіше права задаються складовою сумою, наприклад:
7 – повний доступ (1+2+4);
5 – читання та виконання (1+4).
За промовчанням призначається значення 0777.
$recursiveЛогічний параметр, що визначає, чи можна створювати вкладені піддиректорії.
$contextВикористовується під час роботи з потоками. Додана до PHP 5.0.0.

Приклади використання функції mkdir

mkdir( "newfolder");

mkdir( "../newfolder"); // на рівень нижче

mkdir("/folder1/folder2/newfolder"); // Повний шлях

mkdir( "Newfolder", 0777); // Створення папки з призначенням прав

Якщо потрібно створити кілька вкладених папок, потрібно встановити $recursive = True.

mkdir("folder1/folder2/newfolder", 0777, True); // Створення папки в поточній директорії

видалити теги (12)

Я зіткнувся з кількома випадками з установками WordPressз Bluehost, де я зіткнувся з помилками в моїй темі WordPressтому що папка uploads wp-content/uploads була відсутня.

Очевидно, інсталятор Bluehost cPanel WP не створює цю папку, хоча HostGator робить.

Тому мені потрібно додати код до моєї теми, який перевіряє папку і створює її в іншому випадку.

Answers

Спробуй це:

If (!file_exists("path/to/directory")) ( mkdir("path/to/directory", 0777, true); )

Зауважте, що 0777 вже є режимом за промовчанням для каталогів і все ще може бути змінений поточної umask.

У WordPress є дуже зручна функція wp_mkdir_p яка буде рекурсивно створювати структуру каталогів.

Джерело для довідки: -

Function wp_mkdir_p($target) ( $wrapper = null; // strip the protocol if(wp_is_stream($target)) ( list($wrapper, $target) = explode("://", $target, 2); ) // від php.net/mkdir user contributed notes $target = str_replace("//", "/", $target); = $wrapper ."//".$target; if (empty($target)) $target = "/"; if (file_exists($target)) return @is_dir($target); that exists and inherit that.$ target_parent = dirname($target);while ("." != $target_parent && ! if ($stat = @stat($target_parent)) ( $dir_perms = $stat["mode"] & 0007777; ) else ( $dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Якщо umask is set that modified $dir_perms, we"ll have to re-set $dir_perms correctly with chmod() if ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts = explode( "/", substr($target, strlen($target_parent) + 1)); for ($i = 1; $i<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

Мені потрібне те саме для сайту входу. Мені потрібно було створити каталог із двома змінними. Каталог $ - це основна папка, де я хотів створити іншу підпапку з номером ліцензії користувачів.

Include_once("../include/session.php"); $lnum = $session->lnum; //Users license number from sessions $directory = uploaded_labels; // Name of directory that folder is being created in if (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Щось більш універсальне, тому що це з'являється на Google. Хоча деталі конкретніші, назва цього питання є більш універсальною.

/** * recursively create a long directory path */ function createPath($path) ( if (is_dir($path)) return true; $prev_path = substr($path, 0, strrpos($path, "/", - 2) + 1) $return = createPath($prev_path); return ($return && is_writable($prev_path)) ?

Це займе шлях, можливо, з довгим ланцюжком нестворених каталогів і продовжить рух вгору по одному каталогу доти, доки він не потрапить до існуючого каталогу. Потім він спробує створити наступний каталог у цьому каталозі та продовжити, доки не буде створено всі каталоги. Він повертає true у разі успіху.

Може бути покращено шляхом забезпечення рівня зупинки, тому він просто зазнає невдачі, якщо він виходить за межі папки користувача або ще щось, і включивши дозволи.

Щоб створити папку, якщо вона ще не існує

Розгляд довкілляпитання.

  • WordPress.
  • Сервер веб-хостингу.
  • Припускаючи, що Linux не працює під керуванням PHP.

bool mkdir (string $ pathname [, int $ mode = 0777 [, bool $ recursive = FALSE [, ресурс $ context]]])

У посібнику зазначено, що єдиним обов'язковим параметром є $pathname!

тому ми можемо просто кодувати:

Пояснення:

Нам не потрібно передавати будь-який параметр або перевіряти, чи існує папка або навіть параметр режиму передачі, якщо це необхідно; з наступних причин:

  • Команда створить папку з роздільною здатністю 0755 (за замовчуванням для загальнодоступної папки) або 0777 за промовчанням для команди.
  • mode ігнорується в хосте Windows із запуском PHP .
  • mkdir має вбудовану перевірку, якщо папка існує; тому нам потрібно перевірити лише повернення True | False; і це не помилка, її попередження лише, і попередження відключено на серверах хостингу за промовчанням.
  • Залежно від швидкості, це швидше, якщо попередження вимкнено.

Це ще один спосіб поглянути на питання і не претендувати на краще чи оптимальне рішення.

Протестовано на PHP7, Production Server, Linux

Ви також можете спробувати:

$dirpath = "path/to/dir"; $mode = "0777"; is_dir($dirpath) || mkdir($dirpath, $mode, true);

If (!is_dir("path_directory")) ( @mkdir("path_directory"); )

Більше швидкий спосібстворення папки:

If (!is_dir("path/to/directory")) ( mkdir("path/to/directory", 0777, true); )

Ти зробиш

Printf ("Hi%s,
", $ name);

перед встановленням файлів cookie, що заборонено. Ви не можете надсилати будь-які дані перед заголовками, навіть порожній рядок.