Создать папку с помощью 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); } // from php.net/mkdir user contributed notes $target = str_replace("//", "/", $target); // put the wrapper back on the target if($wrapper !== null) { $target = $wrapper . "://" . $target; } // safe mode fails with a trailing slash under certain PHP versions. $target = rtrim($target, "/"); // Use rtrim() instead of untrailingslashit to avoid formatting.php dependency. if (empty($target)) $target = "/"; if (file_exists($target)) return @is_dir($target); // We need to find the permissions of the parent folder that exists and inherit that. $target_parent = dirname($target); while ("." != $target_parent && ! is_dir($target_parent)) { $target_parent = dirname($target_parent); } // Get the permission bits. if ($stat = @stat($target_parent)) { $dir_perms = $stat["mode"] & 0007777; } else { $dir_perms = 0777; } if (@mkdir($target, $dir_perms, true)) { // If a umask is set that modifies $dir_perms, we"ll have to re-set the $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)) ? mkdir($path) : false; }

Это займет путь, возможно, с длинной цепочкой несозданных каталогов и продолжит движение вверх по одному каталогу до тех пор, пока он не попадет в существующий каталог. Затем он попытается создать следующий каталог в этом каталоге и продолжить, пока не будет создан все каталоги. Он возвращает 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, что запрещено. Вы не можете отправлять какие-либо данные перед заголовками, даже пустую строку.