Директива safe_mode = on, mkdir и решение проблем создания папок на сервере. Функция mkdir в PHP, описание и примеры Php создание папки с последовательным номером

Функция 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 ); // создание папки в текущей директории

В 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 вы всегда подключаетесь к корню, поэтому учтите этот момент.

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


публикация данной статьи разрешена только со ссылкой на сайт автора статьи

В этой статье я опишу один вариант обхода проблемы создания папок с помощью php в безопасном режиме.
Для создания папки в PHP предусмотрена стандартная функция mkdir(), но в большинстве случаев она оказывается безполезной и многие об этом знают, но не многие знают, что обойти эту проблему можно.
Все очень просто, нужно создавать папки с помощью встроенных в php функций FTP.
Ниже пишу об этом подробнее.

Проблемы с mkdir() при создании папки.
Как известно, если в php включен безопасный режим (safe_mode = on), то создавать папки(директории) с помощь mkdir() не получится. Если сказать точнее, то создать можно, а вот дальнейшее использование этой папки будет невозможным. Вы не сможете грузить файлы в эту папку, переименовывать ее и удалить ее не сможете, даже зайдя через FTP (в некоторых случаях через FTP удалить можно).

Безопасный режим включен по умолчанию на всех серверах и всех хостингах. Если у вас нет возможности отключить безопасный режим, то есть другой выход.

Создание папок в php с помощью FTP.
Почти на всех серверах и хостингах в php включена поддержка ftp.
Вот с помощью этих функций и обойдем проблему создания папки mkdir().
Пример создания папки через FTP.

$conn_id = @ ftp_connect ("ftp.server.ru" , 21 , 5 ); // коннектимся к серверу FTP
if($conn_id ) // если соединение с сервером прошло удачно, продолжаем
{
$login_result = @ ftp_login ($conn_id , "user" , "pass" ); // вводим свои логин и пароль для FTP
if($login_result ) // если сервер принял логин пароль, идем дальше
{
// теперь нужно поиграть с пассивным режимом, включить его или выключить(TRUE, FALSE)
// если дальнейшие функции ftp будут работать не правильно, пробуйте менять этот параметр (TRUE или FALE)
ftp_pasv ($conn_id , TRUE ); // в данном случае пассивный режим включен
ftp_mkdir ($conn_id , "1/2/3" ); // ну и само создание папки
}
}
ftp_close ($conn_id ); // и закрываем коннект с FTP
?>
Теперь не большой комментарий к коду.
В первой строке происходит коннект в серверу FTP. Обычно, чтобы законнектиться к локальному FTP серверу достаточно указать localhost в качестве сервера, но можно и полностью указать адрес.
Пассивный режим включить или выключить зависит от настроек FTP.

При создании папки будте внимательны, папка создается от корня входа в FTP. То есть пути тут отличаются от путей файловой системы и папка создается так, как видно именно через FTP.
Если при создании папки вы указываете несколько вложений, как в моем примере "1/2/3", то в этом случае будут созданы все недостающие папки. Если нет папки "1", она будет создана, а в ней будет создана папка "2", а в ней будет создана папка "3". Если промежуточные папки уже существуют, то созданы будут только недостающие.
Перед созданием папки можно переместиться в какую либо папку, например


И после этой функции можно создать папку. Если путь к папке указать "2/3" без начального слэша, тогда папка будет создаваться относительно той папки, в которой сейчас находимся. То есть создана будет папка "1/2/3"


Если при создании папки указать начальный слэш (/1/2/3), то папка будет создана от корня FTP, независимо от того, в какую папку переместились.

Комментарии

14.10.2009 Сергей
все гениальное просто:)

12.12.2009 Виктор
Спасибо, всё работает, вот только в ftp клиенте созданные папки сразу не видны, приходится его перезапускать, т.е. не просто отключить от сервера и коннектиться снова, а закрыть программу и запустить ещё раз (у меня FileZilla Client).

14.12.2009 Админ
Помоему все FTP клиенты кэшируют файлы и папки. Например в Тотал Командере для таких дел существует специальная кнопочка "обновить", обидно что в FileZilla такого нет.

24.01.2010 Александр
как это нет такого в FileZilla у меня версия 3.2.2 ей уже около года и такая функция есть и на сколько я помню всегда была!!!

27.08.2010 Виталий
Папки создаются справами 755, а нужно с 777.
Можно на этапе создания как то настроить с какимим правами будет создаваться папка чере фтп?

27.08.2010 Админ
Виталий, для этого существует функция
ftp_chmod($conn_id, 0777, $file)
после создания папки или файла используйте ее

28.08.2010 Виталий
спасибо, Админ!

12.09.2010 Андрей
Простите а почему у меня не создается несколько директорий то есть:

12.06.2011 Илья
Что-то не ладиться. Сервер выдает:
Warning: ftp_close() expects parameter 1 to be resource, boolean given in /home/bos/p/h/p/phpscripts/public_html/formf.php on line 19

15.06.2011 Виктор
Илья, пишет, первый параметр в функцию ftp_close передаете не правильный

29.06.2011 Алексей
Такая же проблема как у Андрея
(не создается несколько директорий)
ftp_mkdir ($conn_id, "1");// так работает
а вот так ftp_mkdir ($conn_id, "1/2/3");// не работает.
???

27.07.2011 Виктор
Алексей, странно, я проверил, у меня создает несколько папок.
Может какой-то режим хитрый включен на сервере, тогда надо создавать папки поочереди, сначала создать папку 1, затем войти в нее и создать в ней папку 2, затем войти в папку 2 и создать в ней 3...

07.11.2011 k1-801 (можно Дмитрий)
А удалять папки, насколько я понял, через
rmdir_ftp($conn_id, $dir);
так?

И, кстати, у меня почему-то папку не создаёт (и ошибки не пишет... странно...)

10.03.2012 YA
спасибо, а то я намучился с этим вопросоп.
а у тебя все прости и главное работает

29.05.2012 Михаил
Конечно простите. Где этот код писать а то я в этом не шарю вообще а папку создать ну очень надо))

04.07.2012 Nomaq
у меня что-то не так.. первый раз код пропускает, второй раз пишет что такая папка уже существует.. так вроде она создается, но ее не видно даже после перезагрузки фтп((((
и еще, мне нужно папку создать не в той же папке где пхп файл, а вернуться на один шаг назад, и там уже войти в другую папку и там создать.. ни типо такого:
../folder1/тут новая папка
прошу помочь, если не сложно) спасибо)

04.07.2012 Nomaq
с путями разобрался))) спасибо вообще за статью, редко кто нормально объясняет что как)))

27.01.2013 CiliZ
Молодчина, респект за статью

05.06.2013 Василий
Фирменная папка является основным элементом фирменного стиля компании. Представляет собой изделие для вложения небольшого количества документов и бумажных материалов. Папки используют как внутри компании, для хранения и перемещения документации, так и для рекламных целей. Подробнее на сайте: www.logodesigner.ru/papki