Начало / Преглед на Linux / Php работи - Създайте папка, ако все още не съществува. Функция Mkdir в PHP, описание и примери Php създаване на папка, ако не съществува

Php работи - Създайте папка, ако все още не съществува. Функция Mkdir в PHP, описание и примери Php създаване на папка, ако не съществува

Функцията mkdir() създава нова папка в указаната директория. Ако създаването е успешно, връща True. Когато създавате нова папка, можете да зададете права за достъп до нея с помощта на параметъра $mode. Като зададете $recursive на True, можете да създадете множество подпапки.

PHP версия 4 и по-нова.

функция bool mkdir(низ $pathname [, int $mode [, bool $recursive [, ресурс $context]]])

параметри на функцията mkdir

$pathnameПът до директорията, която ще бъде създадена.
$режимПравата върху създадената папка се присвояват като осмична стойност със задължителна нула на първо място (0777). Освен първата нула, числата представляват нива на достъп за собственика, за групата на собственика, за всички останали.
Нивото на достъп се определя от числата:
0 – достъпът е отказан;
1 – достъп за четене;
2 – достъп за запис;
4 – достъп за изпълнение.
Най-често правата се определят като съставна сума, например:
7 – пълен достъп (1+2+4);
5 – четене и изпълнение (1+4).
Стойността по подразбиране е 0777.
$рекурсивенБулев параметър, който определя дали могат да бъдат създадени вложени поддиректории.
$ контекстИзползва се при работа с потоци. Добавен в PHP 5.0.0.

Примери за използване на функцията mkdir

mkdir( "нова папка");

mkdir( "../нова папка" ); // едно ниво надолу

mkdir("/папка1/папка2/нова папка"); // пълен път

mkdir( "нова папка", 0777); // създаване на папка с присвоени права

Ако трябва да създадете няколко подпапки, трябва да зададете $recursive = True.

mkdir("папка1/папка2/нова папка" , 0777, вярно); // създаване на папка в текущата директория


публикуването на тази статия е разрешено само с връзка към уебсайта на автора на статията

В тази статия ще опиша една опция за заобикаляне на проблема със създаването на папки използвайки phpв безопасен режим.
За да създадете папка в PHP, има стандартна функция mkdir(), но в повечето случаи тя се оказва безполезна и много хора знаят за нея, но малко хора знаят, че можете да заобиколите този проблем.
Всичко е много просто, трябва да създадете папки с помощта на вградения php функции FTP.
По-долу пиша за това по-подробно.

Проблеми с mkdir() при създаване на папка.
Както знаете, ако е активиран в php безопасен режим(safe_mode = включен), тогава създаването на папки (директории) с помощта на mkdir() няма да работи. За да бъдем по-точни, можете да го създадете, но по-нататъшното използване на тази папка ще бъде невъзможно. Няма да можете да качвате файлове в тази папка, няма да можете да я преименувате и няма да можете да я изтриете, дори ако влезете през FTP (в някои случаи можете да изтриете през FTP).

Безопасният режим е активиран по подразбиране на всички сървъри и всички хостинг доставчици. Ако нямате възможност да деактивирате безопасен режим, има друг изход.

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

$conn_id = @ ftp_connect ("ftp.server.ru", 21, 5); // свързване към FTP сървъра
ако ($conn_id) // ако връзката със сървъра е успешна, продължете
{
$login_result = @ftp_login($conn_id, "потребител", "пас"); // въведете вашето потребителско име и парола за 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 клиентикеш файлове и папки. Например, в Total Commander има специален бутон „актуализация“ за такива въпроси; жалко е, че FileZilla го няма.

24.01.2010 Александър
Как така във FileZilla няма такова нещо, имам версия 3.2.2, вече е на около година и има такава функция и доколкото си спомням винаги е имало!!!

27.08.2010 г. Виталий
Папките се създават със 755 отдясно, но имате нужда от 777.
На етапа на създаване, възможно ли е по някакъв начин да конфигурирате какви права ще бъде създадена папката чрез FTP?

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

28.08.2010 г. Виталий
благодаря ти, Админ!

09/12/2010 Андрей
Извинете, защо не създам няколко директории, тоест:

06/12/2011 Иля
Нещо не върви добре. Проблеми на сървъра:
Предупреждение: ftp_close() очаква параметър 1 да бъде ресурс, булев, даден в /home/bos/p/h/p/phpscripts/public_html/formf.php на ред 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 в нея...

11/07/2011 k1-801 (Дмитрий е възможно)
И за изтриване на папки, доколкото разбирам, през
rmdir_ftp($conn_id, $dir);
така че

И, между другото, по някаква причина не ми създава папка (и не пише грешки... странно...)

03/10/2012 YA
Благодаря, иначе ме измъчваше този въпрос.
и ти прощаваш всичко и най-важното е, че работи

29.05.2012 г. Михаил
Разбира се, че съжалявам. Къде трябва да напиша този код, иначе изобщо не ме бива, но наистина трябва да създам папка))

07/04/2012 Nomaq
Нещо не ми е наред... първият път кодът прескача, вторият път пише, че вече има такава папка... изглежда, че се създава, но не се вижда дори след рестарт на FTP((((
и също така, трябва да създам папка, която не е в същата папка, в която е PHP файлът, а да се върна една стъпка назад и след това да вляза в друга папка и да я създам там... нещо като това:
../папка1/нова папка тук
моля, помогнете, ако не е трудно) благодаря)

07/04/2012 Nomaq
Разбрах начините))) благодаря като цяло за статията, рядко някой обяснява правилно какво е как)))

27.01.2013 CiliZ
Браво, респект за статията

06/05/2013 Василий
Корпоративната папка е основният елемент корпоративна идентичностфирми. Това е продукт за прикачване на малки количества документи и хартиени материали. Папките се използват както във фирмата, за съхранение и преместване на документация, така и за рекламни цели. Повече подробности на уебсайта: www.logodesigner.ru/papki

премахване на етикети (12)

Срещнах няколко случая с инсталации на WordPress от Bluehost, при които срещнах грешки в моята тема на WordPress, тъй като папката uploads wp-content/uploads липсваше.

Очевидно инсталаторът на Bluehost cPanel WP не създава тази папка, въпреки че HostGator го прави.

Така че трябва да добавя код към моята тема, който проверява за папката и я създава по друг начин.

Отговори

Опитайте това:

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

Имайте предвид, че 0777 вече е режимът по подразбиране за директории и все още може да бъде променен от текущата umask.

WordPress също има много удобна функция wp_mkdir_p, която рекурсивно ще създаде структура на директория.

Източник за справка: -

Функция wp_mkdir_p($target) ( $wrapper = null; // премахване на протокола if(wp_is_stream($target)) ( list($wrapper, $target) = explode("://", $target, 2); ) // от php.net/mkdir допринесли бележки $target = str_replace("//", "/", $target); // поставете обвивката обратно на целта if($wrapper !== null) ( $target ); = $target;) // безопасен режим с наклонена черта в края на PHP. if (empty($target)) $target = "/"; ако (file_exists($target)) връща @is_dir($target) и наследява това. " != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // Вземете битовете за разрешение. if ($stat = @stat($target_parent)) ( $dir_perms = $stat[ "mode"] & 0007777; ) else ( $dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Ако е зададена umask, която променя $dir_perms, ще трябва да пре- задайте правилно $dir_perms с chmod() if ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts = explode( "/", substr($target, strlen($target_parent) + 1));<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

за ($i = 1; $i

Имам нужда от същото за сайта за влизане. Трябваше да създам директория с две променливи. Директорията $ е основната папка, в която исках да създам друга подпапка с номера на потребителския лиценз.

Include_once("../include/session.php"); $lnum = $session->lnum; //Номер на потребителски лиценз от сесии $directory = uploaded_labels; // Име на директорията, в която се създава папката if (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Нещо по-общо, както се показва в Google. Докато подробностите са по-конкретни, заглавието на този въпрос е по-общо.

/** * рекурсивно създаване на дълъг път на директория */ функция createPath($path) ( if (is_dir($path)) return true; $prev_path = substr($path, 0, strrpos($path, "/", - 2) + 1); $return($prev_path); return ($return && is_writable($prev_path)) : false;

Може да се подобри чрез предоставяне на ниво на спиране, така че просто да се провали, ако излезе извън папката на потребителя или нещо подобно, и активиране на разрешения.

За да създадете папка, ако тя все още не съществува

Разглеждане на екологичния проблем.

  • WordPress.
  • Уеб хостинг сървър.
  • Ако приемем, че Linux не работи с PHP.

bool mkdir(низ $pathname[, int $mode=0777[, bool $recursive=FALSE[, resource$context]]])

Ръководството посочва, че единственият задължителен параметър е $pathname!

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

Обяснение:

Не е необходимо да подаваме никакъв параметър или да проверяваме дали папката съществува или дори параметъра за режим на прехвърляне, ако е необходимо; поради следните причини:

  • Командата ще създаде папка с разрешение 0755 (разрешението по подразбиране за публична папка) или 0777, разрешението по подразбиране за командата.
  • режимът се игнорира в Windows хост с PHP .
  • Командата mkdir има вградена проверка дали папката съществува; така че трябва само да проверим за връщане на True | невярно; и това не е грешка, а само предупреждение и предупреждението е деактивирано на хостинг сървърите по подразбиране.
  • В зависимост от скоростта е по-бързо, ако предупреждението е деактивирано.

Това е друг начин за разглеждане на въпроса, а не за най-доброто или оптималното решение.

Тестван на PHP7, производствен сървър, Linux

Можете също да опитате:

$dirpath = "път/до/режим"; $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("Здравейте %s,
", $name);

преди монтажа бисквитки, което е забранено. Не можете да изпращате данни преди заглавките, дори празен ред.

PHP има една функция - mkdir(), която ви позволява да създавате директории на сървъра на уебсайта, които понякога са толкова необходими в домакинството. Например, когато създавате нов материал, трябва да създадете папка за него, където, отново чрез вашата CMS, ще качите всички необходими файлове.

Mkdir("/път/към/моята/директория", 0700);

Тези. в дадена директория създаваме нова папка и например задаваме нейния режим на режим 0700, например, за да можем да записваме файлове в папката, променяме режима на 0777.

Но тук възниква проблемът с mkdir(). Когато правите това php скрипткогато сървърната функция safe_mode е активирана, собственикът (UID) се проверява и ако собственикът на скрипта и папката не съвпадат, тогава може да не можете, например, да запишете файл в създадената директория, да изтриете файл в нея или например чрез FTP няма да можете да изтриете самата папка.

Но има по-елегантно решение на този проблем, без да се налага да молите хостера да деактивира функцията safe_mode вместо вас (тази функция е активирана на абсолютно всички хостинг сайтове по подразбиране, за да се гарантира сигурността). По принцип платените хостинг услуги предоставят и достъп до ftp и от това ще започнем.

$conn_ftp = @ftp_connect("вашият_ftp_сървър", 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 в папката с материали, ако папката с материали не съществува, //също ще бъде създадена, същото с папката public_html (тази директория //е посочена, за да можете да видите целия път, в противен случай е само папка със сайт) ftp_chdir($conn_ftp, "public_html/materials"); //Ако определено имате папка с материали, тогава не е нужно да пишете целия //път, можете просто да отидете първо до нея и след това да създадете папка 345 в нея, като използвате //следния код ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $file); //Всички папки са създадени с режим 0755 по подразбиране, тази команда ще ви позволи да промените //това на 0777, което ще ви позволи да добавяте файлове към създадената папка.

Сега ще дам пълен пример за работещ код, за да можете да видите как изглежда всичко, например моят:

$dir_name = време(); //Тук създавам името на папката въз основа на времето, когато скриптът е стартиран $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 сървър, вие винаги се свързвате към root, така че имайте това предвид.