Интернет. Программы. Windows. Операционные системы. Игры. Восстановление

Как создать новую папку в php. Функция mkdir в PHP, описание и примеры


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

В этой статье я опишу один вариант обхода проблемы создания папок с помощью 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

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

Вам также будет интересно:

Что такое хостинг Какой хостинг самый лучший
Мы выпустили новую книгу «Контент-маркетинг в социальных сетях: Как засесть в голову...
Настройка интернета и Wi-Fi сети Смайл: особенности подключения оборудования Настройка соединения PPPoE на маршрутизаторе
Настройка оборудования Asus RT-N10 для подключения к сети Смайл Предварительно, Вам...
Ускоренный Яндекс Браузер — это реально
Добрый день, друзья. В последние несколько лет Яндекс браузер всё больше набирает...
Как подключить кнопку включения к материнской плате
На передней панели системного блока находятся кнопки, которые необходимы для...
Explay представляет новый смартфон Neo
Торцы и нижняя панель из металла, интересный дизайн, пятидюймовый IPS-дисплей с технологией...