PHP vytvorte adresár, ak neexistuje. Direktíva safe_mode = on, mkdir a riešenie problémov s vytváraním priečinkov na serveri. Príklady použitia funkcie mkdir

  • 03.11.2019

Funkcia mkdir() vytvorí nový priečinok v zadanom adresári. Ak je vytvorenie úspešné, vráti hodnotu True. Pri vytváraní nového priečinka si k nemu môžete nastaviť prístupové práva pomocou parametra $mode. Nastavením $recursive na True môžete vytvoriť viacero podpriečinkov.

PHP verzie 4 a vyššie.

funkcia bool mkdir(reťazec $pathname [, int $mode [, bool $rekurzívny [, zdroj $kontext]]])

parametre funkcie mkdir

$pathnameCesta k adresáru, ktorý sa má vytvoriť.
$modePráva k vytvorenému priečinku sú priradené ako osmičková hodnota s povinnou nulou na prvom mieste (0777). Okrem prvej nuly čísla predstavujú úrovne prístupu pre vlastníka, pre skupinu vlastníkov, pre všetkých ostatných.
Úroveň prístupu je určená číslami:
0 – prístup odmietnutý;
1 – prístup na čítanie;
2 – prístup na zápis;
4 – exekučný prístup.
Práva sú najčastejšie špecifikované ako zložená suma, napríklad:
7 – plný prístup (1+2+4);
5 – čítanie a vykonávanie (1+4).
Predvolená hodnota je 0777.
$rekurzívnyBooleovský parameter, ktorý určuje, či je možné vytvoriť vnorené podadresáre.
$kontextPoužíva sa pri práci s prúdmi. Pridané v PHP 5.0.0.

Príklady použitia funkcie mkdir

mkdir( "nový priečinok");

mkdir( "../novýpriečinok"); // o úroveň nižšie

mkdir("/priečinok1/priečinok2/novýpriečinok" ); // úplná cesta

mkdir( "nový priečinok", 0777); // vytvorte priečinok s priradenými právami

Ak potrebujete vytvoriť viacero podpriečinkov, musíte nastaviť $recursive = True.

mkdir("priečinok1/priečinok2/novýpriečinok" , 0777, True); // vytvorenie priečinka v aktuálnom adresári

odstrániť štítky (12)

Stretol som sa s niekoľkými prípadmi s inštaláciami WordPress z Bluehost, kde som narazil na chyby v mojej WordPress téme, pretože chýbal priečinok uploads wp-content/uploads.

Inštalačný program Bluehost cPanel WP zjavne nevytvára tento priečinok, hoci HostGator áno.

Takže musím do mojej témy pridať kód, ktorý skontroluje priečinok a vytvorí ho inak.

Odpovede

Skúste toto:

If (!file_exists("cesta/do/adresára")) ( mkdir("cesta/do/adresára", 0777, true); )

Všimnite si, že 0777 je už predvolený režim pre adresáre a stále ho môže zmeniť aktuálna maska.

WordPress má tiež veľmi šikovnú funkciu wp_mkdir_p, ktorá rekurzívne vytvorí adresárovú štruktúru.

Zdroj pre referenciu: -

Funkcia wp_mkdir_p($target) ( $wrapper = null; // odstránenie protokolu if(wp_is_stream($target)) ( list($wrapper, $target) = explode("://", $target, 2); ) // z php.net/mkdir poznámky používateľa $target = str_replace("//", "/", $target) // vložiť obal späť do cieľa if($wrapper !== null) ( $target ); = $wrapper . if (empty($ciel)) $ciel = "/"; if (file_exists($target)) return @is_dir($ciel, ktorý existuje a zdediť to $ciel while (". " != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // Získajte bity povolení. if ($stat = @stat($target_parent)) ( $dir_perms = $stat[ "mode"] & 0007777; else ( $dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Ak je nastavený umask, ktorý upravuje $dir_perms, budeme musieť znova- nastavte $dir_perms správne pomocou 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; }

pre ($i = 1; $i

Potrebujem to isté pre prihlasovaciu stránku. Potreboval som vytvoriť adresár s dvoma premennými. Adresár $ je hlavný priečinok, kde som chcel vytvoriť ďalší podpriečinok s licenčným číslom používateľa.

Include_once("../include/session.php"); $lnum = $relácia->lnum; //Používateľské licenčné číslo z relácií $directory = uploaded_labels; // Názov adresára, v ktorom sa vytvára priečinok if (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Niečo všeobecnejšie, ako sa zobrazuje na Googli. Zatiaľ čo podrobnosti sú konkrétnejšie, názov tejto otázky je všeobecnejší.

Toto bude mať cestu s možno dlhým reťazcom nevytvorených adresárov a bude pokračovať v pohybe o jeden adresár vyššie, až kým neskončí v existujúcom adresári. Potom sa pokúsi vytvoriť ďalší adresár v tomto adresári a pokračovať, kým sa nevytvoria všetky adresáre. V prípade úspechu vráti hodnotu true.

Dalo by sa vylepšiť poskytnutím úrovne zastavenia, takže jednoducho zlyhá, ak sa dostane mimo priečinok používateľa alebo niečo iné, a povolením povolení.

Ak chcete vytvoriť priečinok, ak ešte neexistuje

Zváženie problematiky životného prostredia.

  • WordPress.
  • Webhostingový server.
  • Za predpokladu, že Linux nebeží PHP.

bool mkdir(reťazec $cesta[, int $režim=0777[, bool $rekurzívny=FALSE[, zdroj$kontext]]])

Manuál uvádza, že jediným povinným parametrom je $pathname !

takže môžeme jednoducho kódovať:

Vysvetlenie:

Nepotrebujeme zadávať žiadny parameter alebo kontrolovať, či priečinok existuje, alebo dokonca parameter režimu prenosu, ak je to potrebné; z nasledujúcich dôvodov:

  • Príkaz vytvorí priečinok s rozlíšením 0755 (predvolené povolenie pre verejný priečinok) alebo 0777, predvolené povolenie pre príkaz.
  • režim je ignorovaný Hostiteľ systému Windows so systémom PHP .
  • Príkaz mkdir má zabudovanú kontrolu, či priečinok existuje; takže musíme len skontrolovať, či sa vracia True | falošné; a toto nie je chyba, je to len varovanie a varovanie je na hostiteľských serveroch predvolene vypnuté.
  • V závislosti od rýchlosti je rýchlejší, ak je varovanie vypnuté.

Toto je ďalší spôsob, ako sa pozrieť na otázku a nenárokovať si najlepšie alebo optimálne riešenie.

Testované na PHP7, Production Server, Linux

Môžete tiež vyskúšať:

$dirpath = "cesta/k/adresar"; $mode = "0777"; is_dir($dirpath) || mkdir($dirpath, $mode, true);

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

Rýchlejší spôsob vytvorenia priečinka:

If (!is_dir("cesta/do/adresára")) ( mkdir("cesta/do/adresára", 0777, true); )

urobíš

Printf("Ahoj %s,
", $meno);

pred inštaláciou cookies, čo je zakázané. Pred hlavičky nemôžete odoslať žiadne údaje, dokonca ani prázdny riadok.

PHP má jedinú funkciu – mkdir(), ktorá vám umožňuje vytvárať na serveri webstránky adresáre, ktoré sú niekedy v domácnosti tak potrebné. Napríklad pri vytváraní nového materiálu je potrebné preň vytvoriť priečinok, kam opäť pomocou CMS nahráte všetky potrebné súbory.

Mkdir("/cesta/k/mojmu/adresaru", 0700);

Tie. v určitom adresári vytvoríme nový priečinok a napríklad mu nastavíme režim na režim 0700, napríklad aby sme do priečinka mohli zapisovať súbory, zmeníme režim na 0777.

Ale tu vzniká problém s mkdir(). Pri spustení tohto php skriptu so zapnutou funkciou servera safe_mode sa skontroluje vlastník (UID) a ak sa vlastník skriptu a priečinok nezhodujú, môže sa stať, že nebudete môcť napríklad zapísať súbor do vytvoreného adresár, zmazať súbor v ňom, alebo napríklad cez FTP si Samotný priečinok nezmažete.

Existuje však elegantnejšie riešenie tohto problému bez toho, aby ste museli požiadať hostiteľa, aby za vás deaktivoval funkciu safe_mode (táto funkcia je štandardne povolená na úplne všetkých hostingových stránkach, aby bola zaistená bezpečnosť). Platené hostingové služby v podstate poskytujú aj prístup k ftp a od toho začneme.

$conn_ftp = @ftp_connect("váš_ftp_server", 21, 5);

Prvá premenná vo funkcii je adresa vášho ftp servera, druhá je port, na ktorom sa pripájate k ftp a posledná je povolený časový limit pripojenia. Trochu o časovom limite, ktorý je potrebný pre následné sieťové operácie, ak ho nezadáte, potom je predvolená hodnota nastavená na 90 sekúnd. Po pripojení skontrolujeme, či bolo úspešné a pošleme prihlasovacie meno a heslo:

If($conn_ftp) // pripojenie bolo úspešné ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // zadajte svoje prihlasovacie meno a heslo pre FTP if($login_result) // overenie prihlasovacieho mena a hesla prebehlo úspešne success(ftp_pasv($conn_ftp, TRUE);))

Po kontrole prihlasovacieho mena a hesla sa musíme rozhodnúť pre pasívny režim a nastaviť ho na TRUE alebo FALSE - je to potrebné, ak ďalšie funkcie FTP nebudú fungovať správne. Teraz po definovaní pasívneho režimu môžeme vytvoriť naše priečinky, popíšem všetky funkcie, ktoré sa vám môžu v budúcnosti hodiť:

$file = ftp_mkdir($conn_ftp, "public_html/materials/345"); //Vytvorenie adresára 345 v priečinku materiálov, ak priečinok materiálov neexistuje, //vytvorí sa tiež, rovnako ako priečinok public_html (tento adresár //je označený, aby ste videli celú cestu, inak je len priečinok so stránkou) ftp_chdir($conn_ftp, "public_html/materials"); //Ak určite máte priečinok materiálov, nemusíte písať celú //cestu, môžete doň najskôr prejsť a potom v ňom vytvoriť priečinok pomocou //nasledujúceho kódu ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $súbor); //Všetky priečinky sú štandardne vytvorené v režime 0755, tento príkaz vám umožní zmeniť //to na 0777, čo vám umožní pridávať súbory do vytvoreného priečinka.

Teraz uvediem úplný príklad pracovného kódu, aby ste videli, ako to celé vyzerá, napríklad môj:

$dir_name = cas(); //Tu vytvorím názov priečinka podľa času spustenia skriptu $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // pripojenie bolo úspešné ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // zadajte svoje prihlasovacie meno a heslo pre FTP if($login_result) // overenie prihlasovacieho mena a hesla prebehlo úspešne úspech ( 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); )

Tiež stojí za to povedať niečo o špecifikovaní adresárov pri vytváraní, ak na začiatku zadáte lomku, priečinok sa vytvorí vzhľadom na koreň ftp. Keď sa pripájate k serveru FTP, vždy sa pripájate ku rootu, takže na to pamätajte.


uverejnenie tohto článku je povolené len s odkazom na webovú stránku autora článku

V tomto článku popíšem jednu možnosť, ako obísť problém vytvárania priečinkov pomocou php v núdzovom režime.
Na vytvorenie priečinka v PHP existuje štandardná funkcia mkdir(), ktorá sa však vo väčšine prípadov ukáže ako zbytočná a veľa ľudí o nej vie, no málokto vie, že tento problém môžete obísť.
Všetko je veľmi jednoduché, musíte vytvárať priečinky pomocou funkcií FTP zabudovaných do php.
Nižšie o tom píšem podrobnejšie.

Problémy s mkdir() pri vytváraní priečinka.
Ako viete, ak je v php povolený bezpečný režim (safe_mode = on), vytváranie priečinkov (adresárov) pomocou mkdir() nebude fungovať. Presnejšie povedané, môžete ho vytvoriť, ale ďalšie použitie tohto priečinka bude nemožné. Do tohto priečinka nebudete môcť nahrávať súbory, nebudete ho môcť premenovať a nebudete ho môcť vymazať, aj keď sa prihlásite cez FTP (v niektorých prípadoch môžete mazať cez FTP).

Núdzový režim je predvolene povolený na všetkých serveroch a u všetkých poskytovateľov hostingu. Ak nemáte možnosť vypnúť núdzový režim, existuje aj iné východisko.

Vytváranie priečinkov v php pomocou FTP.
Takmer všetky servery a hosting majú povolenú podporu ftp v php.
Pomocou týchto funkcií obídeme problém vytvorenia priečinka mkdir().
Príklad vytvorenia priečinka cez FTP.

$conn_id = @ ftp_connect ("ftp.server.ru" , 21 , 5 ); // pripojenie k serveru FTP
if($conn_id) // ak bolo pripojenie k serveru úspešné, pokračujte
{
$login_result = @ftp_login($conn_id, "user", "pass"); // zadajte svoje prihlasovacie meno a heslo pre FTP
if($login_result) // ak server akceptoval prihlasovacie heslo, pokračujte
{
// teraz sa musíte pohrať s pasívnym režimom, zapnúť alebo vypnúť (TRUE, FALSE)
// ak ďalšie funkcie ftp nefungujú správne, skúste zmeniť tento parameter (TRUE alebo FALE)
ftp_pasv($conn_id, TRUE); // v tomto prípade je povolený pasívny režim
ftp_mkdir($conn_id, "1/2/3"); // a samotné vytvorenie priečinka
}
}
ftp_close($conn_id); // a zatvorte pripojenie FTP
?>
Teraz, bez veľkého komentára ku kódu.
Prvý riadok sa pripája k serveru FTP. Na pripojenie k lokálnemu FTP serveru zvyčajne stačí zadať localhost ako server, ale môžete zadať aj úplnú adresu.
Či je pasívny režim povolený alebo zakázaný, závisí od nastavení FTP.

Pri vytváraní priečinka buďte opatrní, priečinok sa vytvára z FTP prihlasovacieho koreňa. To znamená, že cesty sa tu líšia od ciest súborového systému a priečinok je vytvorený tak, ako je vidieť cez FTP.
Ak pri vytváraní priečinka zadáte niekoľko príloh, ako v mojom príklade "1/2/3", potom sa v tomto prípade vytvoria všetky chýbajúce priečinky. Ak neexistuje priečinok "1", vytvorí sa tento a v ňom sa vytvorí priečinok "2" a v ňom sa vytvorí priečinok "3". Ak medzipriečinky už existujú, vytvoria sa iba chýbajúce.
Pred vytvorením priečinka sa môžete presunúť do priečinka napr


A po tejto funkcii môžete vytvoriť priečinok. Ak je cesta k priečinku zadaná ako „2/3“ bez úvodnej lomky, priečinok sa vytvorí relatívne k priečinku, v ktorom sa práve nachádzame. To znamená, že sa vytvorí priečinok "1/2/3".


Ak pri vytváraní priečinka určíte úvodnú lomku (/1/2/3), priečinok sa vytvorí z koreňového adresára FTP bez ohľadu na to, do ktorého priečinka ste sa presunuli.

Komentáre

14.10.2009 Sergej
všetko geniálne je jednoduché :)

12.12.2009 Viktor
Ďakujem, všetko funguje, ale v ftp klientovi nie sú vytvorené priečinky hneď viditeľné, treba ho reštartovať, t.j. nielen sa odpojiť od servera a znova sa pripojiť, ale zavrieť program a znova ho spustiť (používam klienta FileZilla).

14.12.2009 Admin
Myslím, že všetci FTP klienti vyrovnávajú súbory a priečinky. Napríklad v Total Commander je pre takéto záležitosti špeciálne tlačidlo „aktualizovať“, je škoda, že to FileZilla nemá.

24.01.2010 Alexander
Ako to, že vo FileZille nič také nie je, mám verziu 3.2.2, už má asi rok a je tam taká funkcia a pokiaľ si pamätám, vždy bola!!!

27.08.2010 Vitalij
Priečinky sa vytvárajú s 755 vpravo, ale potrebujete 777.
Je možné vo fáze vytvárania nejako nakonfigurovať, aké práva sa vytvorí priečinok cez FTP?

27.08.2010 Admin
Vitaly, existuje na to funkcia
ftp_chmod($conn_id, 0777, $file)
po vytvorení priečinka alebo súboru ho použite

28.08.2010 Vitalij
ďakujem, Admin!

9.12.2010 Andrej
Prepáčte, prečo si nevytvorím niekoľko adresárov, teda:

6.12.2011 Iľja
Niečo nie je v poriadku. Problémy so serverom:
Upozornenie: ftp_close() očakáva, že parameter 1 bude zdrojom, boolovský daný v /home/bos/p/h/p/phpscripts/public_html/formf.php v riadku 19

15.06.2011 Viktor
Iľja, píše, že prvý parameter, ktorý odovzdávate funkcii ftp_close, nie je správny

29.06.2011 Alexey
Rovnaký problém ako Andrej
(nie sú vytvorené viaceré adresáre)
ftp_mkdir ($conn_id, "1"); // takto to funguje
ale takto ftp_mkdir ($conn_id, "1/2/3" nefunguje);
???

27.07.2011 Viktor
Alexey, zvláštne, skontroloval som, že mi to vytvára niekoľko priečinkov.
Možno je na serveri povolený nejaký zložitý režim, potom musíte vytvoriť priečinky jeden po druhom, najskôr vytvoriť priečinok 1, potom ho zadať a vytvoriť v ňom priečinok 2, potom zadať priečinok 2 a vytvoriť v ňom priečinok 3...

11/07/2011 k1-801 (Dmitry je možný)
A vymazať priečinky, pokiaľ tomu rozumiem, cez
rmdir_ftp($conn_id, $dir);
Takže?

A mimochodom, z nejakého dôvodu mi nevytvorí priečinok (a nezapíše chyby... zvláštne...)

03/10/2012 YA
Ďakujem, inak ma potrápila táto otázka.
a všetko odpustíš a hlavné je, že to funguje

29.05.2012 Michail
Samozrejme, že ma to mrzí. Kde mám napísať tento kód, inak v tom vôbec nie som dobrý, ale naozaj potrebujem vytvoriť priečinok))

07/04/2012 Nomaq
Niečo mi vadí... prvý krát kód preskočí, druhý krát píše, že takýto priečinok už existuje... zdá sa, že sa vytvára, ale nie je viditeľný ani po reštarte FTP((((
a tiež musím vytvoriť priečinok, ktorý nie je v tom istom priečinku, v ktorom je súbor PHP, ale vrátiť sa o krok späť a potom zadať ďalší priečinok a vytvoriť ho tam.. niečo takéto:
../folder1/new folder tu
prosím pomôžte, ak to nie je ťažké) ďakujem)

07/04/2012 Nomaq
Prišiel som na spôsoby))) vo všeobecnosti ďakujem za článok, je zriedkavé, že niekto správne vysvetlí, ako)))

27.01.2013 CiliZ
Výborne, rešpekt k článku

06.05.2013 Vasilij
Firemný priečinok je hlavným prvkom firemnej identity. Je to produkt na pripevnenie malého množstva dokumentov a papierových materiálov. Zakladače sa používajú ako v rámci firmy, na ukladanie a presúvanie dokumentácie, tak aj na reklamné účely. Viac podrobností na webovej stránke: www.logodesigner.ru/papki