Creați un folder folosind php. Directiva safe_mode = on, mkdir și rezolvarea problemelor cu crearea folderelor pe server. Exemple de utilizare a funcției mkdir

02.04.2020 Siguranță

PHP are o singură funcție - mkdir(), care vă permite să creați directoare pe serverul site-ului web, care uneori sunt atât de necesare în gospodărie. De exemplu, atunci când creați un material nou, trebuie să creați un folder pentru acesta, unde, folosind din nou CMS, veți încărca toate fișierele necesare.

Mkdir("/calea/la/my/dir", 0700);

Acestea. într-un anumit director pe care îl creăm dosar nouși de exemplu îl setăm la modul 0700, de exemplu, pentru a putea scrie fișiere în folder, schimbăm modul la 0777.

Dar aici apare problema cu mkdir(). Când executați acest script php cu funcția de server safe_mode activată, proprietarul (UID) este verificat și dacă proprietarul scriptului și al folderului nu se potrivesc, atunci este posibil să nu puteți, de exemplu, să scrieți un fișier în fișierul creat. director, ștergeți un fișier din el sau, de exemplu, prin FTP. Nu veți putea șterge folderul în sine.

Dar există o soluție mai elegantă la această problemă, fără a fi nevoie să ceară hosterului să dezactiveze funcția safe_mode pentru tine ( această funcție activat pe absolut toate site-urile de găzduire în mod implicit pentru a asigura securitatea). Fundamental găzduiri plătite De asemenea, oferă acces la ftp, de la care vom începe.

$conn_ftp = @ftp_connect(„serverul_ftp_dvs”, 21, 5);

Prima variabilă din funcție este adresa serverului dvs. ftp, a doua este portul pe care vă conectați la ftp și ultima este expirarea conexiunii permisă. Un pic despre timeout, este necesar pentru operațiunile de rețea ulterioare; dacă nu îl introduceți, atunci valoarea implicită este setată la 90 de secunde. După conexiune, verificăm dacă a avut succes și trimitem login-ul și parola:

Dacă($conn_ftp) // conexiunea a fost reușită ( $login_result = @ftp_login($conn_ftp, „user”, „pass”); // introduceți datele dvs. de conectare și parola pentru FTP if($login_result) // autentificarea și verificarea parolei a trecut succes(ftp_pasv($conn_ftp, TRUE);))

După verificarea login-ului și a parolei, trebuie să decidem asupra modului pasiv și să-l setăm la TRUE sau FALSE - acest lucru este necesar dacă alte funcții FTP nu vor funcționa corect. Acum, după definirea modului pasiv, ne putem crea folderele, voi descrie toate funcțiile care vă pot fi utile în viitor:

$fișier = ftp_mkdir($conn_ftp, "public_html/materials/345"); //Se creează directorul 345 în folderul de materiale, dacă folderul de materiale nu există, //se va crea și el, la fel cu folderul public_html (acest director //este indicat pentru a putea vedea întreaga cale, altfel este doar un folder cu site) ftp_chdir($conn_ftp, "public_html/materials"); //Dacă cu siguranță aveți un folder de materiale, atunci nu trebuie să scrieți întreaga cale //, puteți doar să mergeți la el mai întâi și apoi să creați un folder 345 în el folosind // următorul cod ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $fișier); //Toate folderele sunt create implicit cu modul 0755, această comandă vă va permite să îl schimbați // la 0777, ceea ce vă va permite să adăugați fișiere în folderul creat.

Acum voi da un exemplu complet de cod de lucru, astfel încât să puteți vedea cum arată totul, de exemplu, al meu:

$dir_name = time(); //Aici creez numele folderului în funcție de momentul lansării scriptului $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // conexiunea a fost reușită ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // introduceți datele dvs. de conectare și parola pentru FTP if($login_result) // autentificarea și verificarea parolei a trecut succes ( 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); ) )

De asemenea, merită să spunem puțin despre specificarea directoarelor la creare; dacă specificați o bară oblică la început, folderul va fi creat în raport cu rădăcina ftp. Când este conectat la server FTP te conectezi mereu la rădăcină, așa că ține cont de asta.

Funcția mkdir() creează un folder nou în directorul specificat. Dacă crearea are succes, returnează True. Când creați un folder nou, puteți seta drepturi de acces la acesta folosind parametrul $mode. Setând $recursive la True, puteți crea mai multe subdosare.

PHP versiunea 4 și superioară.

funcția bool mkdir(șir $pathname [, int $mode [, bool $recursiv [, resursă $context]]])

parametrii funcției mkdir

$pathnameCalea către directorul care urmează să fie creat.
$modeDrepturi asupra folderului creat Drepturile sunt atribuite ca valoare octală cu un zero obligatoriu în primul rând (0777). În afară de primul zero, numerele reprezintă niveluri de acces pentru proprietar, pentru grupul proprietarului, pentru toți ceilalți.
Nivelul de acces este determinat de numerele:
0 – acces refuzat;
1 – acces la citire;
2 – acces la scriere;
4 – acces la execuție.
Cel mai adesea, drepturile sunt specificate ca o sumă compusă, de exemplu:
7 – acces complet (1+2+4);
5 – citire și execuție (1+4).
Valoarea implicită este 0777.
$recursivUn parametru boolean care determină dacă pot fi create subdirectoare imbricate.
$contextFolosit atunci când lucrați cu fluxuri. Adăugat în PHP 5.0.0.

Exemple de utilizare a funcției mkdir

mkdir( "dosar nou" );

mkdir( "../dosar nou" ); // un nivel mai jos

mkdir("/folder1/folder2/newfolder"); // cale completă

mkdir( „folder nou”, 0777); // creează un folder cu drepturi atribuite

Dacă trebuie să creați mai multe subfoldere, trebuie să setați $recursive = True.

mkdir("folder1/folder2/newfolder" , 0777, True ); // creează un folder în directorul curent

eliminați etichetele (12)

Am întâlnit mai multe cazuri cu Instalări WordPress cu Bluehost unde am întâlnit erori în mine Tema WordPress deoarece lipsea dosarul de încărcări wp-content/uploads.

Se pare că programul de instalare Bluehost cPanel WP nu creează acest folder, deși HostGator o face.

Așa că trebuie să adaug cod la tema mea care verifică folderul și îl creează altfel.

Răspunsuri

Incearca-l:

Dacă (!file_exists("cale/către/director")) ( mkdir("cale/către/director", 0777, adevărat); )

Rețineți că 0777 este deja modul implicit pentru directoare și poate fi schimbat în continuare de umask curent.

WordPress are, de asemenea, o funcție foarte utilă wp_mkdir_p care va crea recursiv o structură de directoare.

Sursa de referinta:-

Funcția wp_mkdir_p($țintă) ( $wrapper = nul; // dezlipește protocolul if(wp_is_stream($țintă)) ( list($wrapper, $țintă) = explode("://", $țintă, 2); ) // de la php.net/mkdir notele contribuite de utilizator $target = str_replace("//", "/", $target); // pune wrapper-ul înapoi pe țintă if($wrapper !== null) ( $target = $wrapper . "://" . $target; ) // modul sigur eșuează cu o bară oblică finală în anumite versiuni PHP. $target = rtrim($target, "/"); // Folosiți rtrim() în loc de untrailingslashit pentru a evita dependența formatării.php.if (empty($target)) $target = "/"; if (file_exists($target)) return @is_dir($target); // Trebuie să găsim permisiunile folderului părinte care există și moștenește asta. $target_parent = dirname($target); while ("." != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // Obține biții de permisiune. if ($stat = @stat($target_parent)) ( $dir_perms = $stat["modul"] & 0007777; ) else ( $dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Dacă este setată o umask care modifică $dir_perms, va trebui să resetăm corect $dir_perms cu chmod() if ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts = explode() "/", substr($target, strlen($target_parent) + 1)); pentru ($i = 1; $i<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

Am nevoie de același lucru pentru site-ul de conectare. Trebuia să creez un director cu două variabile. Directorul $ este folderul principal în care am vrut să creez un alt subfolder cu numărul de licență al utilizatorilor.

Include_once("../include/session.php"); $lnum = $sesiune->lnum; //Numărul licenței utilizatorilor din sesiuni $directory = uploaded_labels; // Numele directorului în care folderul este creat dacă (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Ceva mai generic așa cum apare pe google. Deși detaliile sunt mai specifice, titlul acestei întrebări este mai generic.

/** * creează recursiv o cale de director lungă */ funcția createPath($cale) ( dacă (is_dir($cale)) returnează adevărat; $prev_path = substr($cale, 0, strrpos($cale, "/", - 2) + 1); $retur = createPath($prev_path); return ($return && is_writable($prev_path)) ? mkdir($path) : false; )

Aceasta va lua o cale cu posibil un lanț lung de directoare necreate și va continua să se mute într-un director până când ajunge într-un director existent. Apoi va încerca să creeze următorul director în acel director și va continua până când toate directoarele au fost create. Revine adevărat dacă are succes.

Ar putea fi îmbunătățit prin furnizarea unui nivel de oprire, astfel încât pur și simplu să eșueze dacă iese din folderul utilizatorului sau ceva de genul acesta și prin activarea permisiunilor.

Pentru a crea un folder dacă nu există deja

Considerare mediu inconjuratorîntrebare.

  • WordPress.
  • Server de gazduire web.
  • Presupunând că Linux nu rulează PHP.

bool mkdir(șir $pathname[, int $mode=0777[, bool $recursive=FALSE[, resursă$context]]])

Manualul afirmă că singurul parametru necesar este $pathname !

deci putem codifica pur și simplu:

Explicaţie:

Nu trebuie să trecem niciun parametru sau să verificăm dacă folderul există sau chiar parametrul modului de transfer dacă este necesar; următoarele motive:

  • Comanda va crea un folder cu o rezoluție de 0755 (permisiunea implicită pentru un folder public) sau 0777, permisiunea implicită pentru comandă.
  • modul este ignorat în Gazdă Windows care rulează PHP .
  • Comanda mkdir are o verificare încorporată dacă folderul există; deci trebuie doar să verificăm dacă returnează True | Fals; și aceasta nu este o eroare, este doar un avertisment, iar avertismentul este dezactivat implicit pe serverele de găzduire.
  • În funcție de viteză, este mai rapid dacă avertismentul este dezactivat.

Acesta este un alt mod de a privi întrebarea și de a nu pretinde cea mai bună sau optimă soluție.

Testat pe PHP7, Production Server, Linux

De asemenea, puteți încerca:

$dirpath = "cale/spre/dir"; $mode = "0777"; is_dir($dirpath) || mkdir($dirpath, $mod, adevărat);

Dacă (!is_dir("directorul_cale")) ( @mkdir("directorul_cale"); )

Mai mult cale rapidă crearea unui folder:

Dacă (!is_dir("cale/către/director")) ( mkdir("cale/către/director", 0777, adevărat); )

Tu faci

Printf("Bună %s,
", $nume);

înainte de instalare cookie-uri, care este interzis. Nu puteți trimite date înainte de anteturi, nici măcar o linie goală.