Stvorite mapu koristeći php. Direktiva safe_mode = on, mkdir i rješavanje problema sa stvaranjem mapa na poslužitelju. Primjeri korištenja funkcije mkdir

02.04.2020 Sigurnost

PHP ima jednu funkciju - mkdir(), koja vam omogućuje stvaranje direktorija na poslužitelju web stranice, koji su ponekad toliko potrebni u kućanstvu. Na primjer, kada kreirate novi materijal, trebate napraviti mapu za njega, gdje ćete, opet koristeći svoj CMS, uploadati sve potrebne datoteke.

Mkdir("/staza/do/moj/dir", 0700);

Oni. u određenom imeniku koji kreiramo nova mapa i na primjer postavimo ga na mod 0700, na primjer, da bismo mogli pisati datoteke u mapu, promijenimo mod na 0777.

Ali tu nastaje problem s mkdir(). Prilikom izvršavanja ove php skripte s omogućenom funkcijom poslužitelja safe_mode, vlasnik (UID) se provjerava i ako se vlasnik skripte i mapa ne podudaraju, tada možda nećete moći, na primjer, napisati datoteku u stvorenu mapu, izbrišite datoteku u njoj ili, primjerice, putem FTP-a nećete moći izbrisati samu mapu.

Ali postoji elegantnije rješenje za ovaj problem, bez potrebe da tražite hostera da vam onemogući funkciju safe_mode ( ovu funkciju omogućeno na apsolutno svim hosting stranicama prema zadanim postavkama kako bi se osigurala sigurnost). Temeljno plaćeni hostingi Oni također pružaju pristup ftp-u, od ovoga ćemo početi.

$conn_ftp = @ftp_connect("vaš_ftp_poslužitelj", 21, 5);

Prva varijabla u funkciji je adresa vašeg ftp poslužitelja, druga je port na kojem se spajate na ftp, a posljednja je dopušteno vremensko ograničenje veze. Malo o vremenskom ograničenju, potrebno je za sljedeće mrežne operacije; ako ga ne unesete, tada je zadana vrijednost postavljena na 90 sekundi. Nakon povezivanja provjeravamo je li uspjelo i šaljemo prijavu i lozinku:

If($conn_ftp) // veza je bila uspješna ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // unesite svoju prijavu i lozinku za FTP if($login_result) // provjera prijave i lozinke prošla uspjeh(ftp_pasv($conn_ftp, TRUE);))

Nakon provjere prijave i lozinke, moramo odlučiti o pasivnom načinu rada i postaviti ga na TRUE ili FALSE - to je potrebno ako daljnje FTP funkcije neće ispravno raditi. Sada nakon definiranja pasivnog načina rada, možemo kreirati naše mape, opisat ću sve funkcije koje bi vam mogle biti korisne u budućnosti:

$file = ftp_mkdir($conn_ftp, "public_html/materials/345"); //Stvaranje direktorija 345 u mapi materijala, ako mapa materijala ne postoji, //također će biti kreirana, isto kao i mapa public_html (ovaj direktorij //naznačen je tako da možete vidjeti cijeli put, inače je samo mapa sa web mjestom) ftp_chdir($conn_ftp, "public_html/materials"); //Ako definitivno imate mapu materijala, onda ne morate pisati cijelu //putnju, možete prvo otići do nje, a zatim stvoriti mapu 345 u njoj koristeći //sljedeći kod ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $file); //Sve se mape stvaraju prema zadanim postavkama s načinom rada 0755, ovu naredbu omogućit će vam promjenu // u 0777, što će vam omogućiti dodavanje datoteka u stvorenu mapu.

Sada ću dati potpuni primjer radnog koda tako da možete vidjeti kako to sve izgleda, na primjer, moj:

$dir_name = vrijeme(); //Ovdje stvaram naziv mape na temelju vremena kada je skripta pokrenuta $conn_ftp = @ftp_connect("vaš_ftp_poslužitelj", 21, 5); if($conn_ftp) // veza je bila uspješna ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // unesite svoju prijavu i lozinku za FTP if($login_result) // provjera prijave i lozinke prošla uspjeh ( 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); ) )

Također je vrijedno reći nešto o određivanju direktorija prilikom stvaranja; ako navedete kosu crtu na početku, mapa će se stvoriti u odnosu na ftp korijen. Kada je spojen na FTP poslužitelj uvijek se spajate na root, pa imajte ovo na umu.

Funkcija mkdir() stvara novu mapu u navedenom direktoriju. Ako je stvaranje uspješno, vraća True. Kada stvarate novu mapu, možete joj postaviti prava pristupa pomoću parametra $mode. Postavljanjem $recursive na True, možete stvoriti više podmapa.

PHP verzija 4 i novija.

funkcija bool mkdir(string $pathname [, int $mode [, bool $recursive [, resurs $context]]])

parametri funkcije mkdir

$pathnamePut do imenika koji će se stvoriti.
$načinPrava na kreiranu mapu Prava se dodjeljuju kao oktalna vrijednost s obaveznom nulom na prvom mjestu (0777). Osim prve nule, brojevi predstavljaju razine pristupa za vlasnika, za vlasničku grupu, za sve ostale.
Razina pristupa određena je brojevima:
0 – pristup odbijen;
1 – pristup čitanju;
2 – pristup za pisanje;
4 – pristup izvršenju.
Najčešće se prava navode kao zbirni iznos, na primjer:
7 – puni pristup (1+2+4);
5 – čitanje i izvođenje (1+4).
Zadana vrijednost je 0777.
$rekurzivnoBooleov parametar koji određuje mogu li se stvoriti ugniježđeni poddirektoriji.
$kontekstKoristi se pri radu s tokovima. Dodano u PHP 5.0.0.

Primjeri korištenja funkcije mkdir

mkdir( "nova mapa" );

mkdir( "../nova mapa" ); // jednu razinu niže

mkdir("/mapa1/mapa2/nova mapa"); // puni put

mkdir( "nova mapa" , 0777); // stvoriti mapu s dodijeljenim pravima

Ako trebate stvoriti više podmapa, trebate postaviti $recursive = True.

mkdir("mapa1/mapa2/nova mapa" , 0777, Istina ); // stvaranje mape u trenutnom direktoriju

ukloniti oznake (12)

Susreo sam se s nekoliko slučajeva s WordPress instalacije s Bluehostom gdje sam naišao na pogreške u svom WordPress tema jer nedostaje mapa wp-content/uploads uploads.

Očigledno Bluehost cPanel WP instalacijski program ne stvara ovu mapu, iako HostGator radi.

Dakle, moram dodati kod svojoj temi koja provjerava mapu i stvara je inače.

Odgovori

Probaj:

Ako (!file_exists("put/do/direktorija")) ( mkdir("put/do/direktorija", 0777, istina); )

Imajte na umu da je 0777 već zadani način rada za imenike i još uvijek se može promijeniti pomoću trenutne umaske.

WordPress također ima vrlo zgodnu funkciju wp_mkdir_p koja će rekurzivno kreirati strukturu direktorija.

Izvor za referencu: -

Funkcija wp_mkdir_p($target) ( $wrapper = null; // uklanja protokol if(wp_is_stream($target)) ( list($wrapper, $target) = explode("://", $target, 2); ) // iz php.net/mkdir korisničkih bilješki $target = str_replace("//", "/", $target); // vrati omot na cilj if($wrapper !== null) ( $target = $wrapper . "://" . $target; ) // sigurni način rada ne uspijeva s kosom crtom na kraju pod određenim PHP verzijama. $target = rtrim($target, "/"); // Koristite rtrim() umjesto untrailingslashit kako bi se izbjegla ovisnost o formatting.php. if (empty($target)) $target = "/"; if (file_exists($target)) return @is_dir($target); // Moramo pronaći dopuštenja nadređene mape koji postoji i naslijedite to. $target_parent = dirname($target); while ("." != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // Dohvatite bitove dopuštenja. if ($stat = @stat($target_parent)) ( $dir_perms = $stat["mode"] & 0007777; ) else ( $dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Ako je postavljena umask koja mijenja $dir_perms, morat ćemo ponovo ispravno postaviti $dir_perms pomoću chmod() if ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts = explode( "/", substr($target, strlen($target_parent) + 1)); za ($i = 1; $i<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

Trebam isto za mjesto za prijavu. Trebao sam stvoriti direktorij s dvije varijable. Direktorij $ glavna je mapa u kojoj sam želio stvoriti drugu podmapu s brojem korisničke licence.

Uključi_jednom("../include/session.php"); $lnum = $session->lnum; //Korisnički broj licence iz sesija $directory = uploaded_labels; // Naziv direktorija u kojem se ta mapa stvara if (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Nešto općenitije kao što se prikazuje na Googleu. Iako su detalji specifičniji, naslov ovog pitanja je općenitiji.

/** * rekurzivno kreira dugi put direktorija */ funkcija 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; )

Ovo će ići putem s mogućim dugim lancem nestvorenih direktorija i nastaviti se pomicati prema gore za jedan direktorij dok ne završi u postojećem direktoriju. Zatim će pokušati stvoriti sljedeći direktorij unutar tog direktorija i nastaviti dok se svi direktoriji ne stvore. Vraća true ako je uspješno.

Može se poboljšati pružanjem razine zaustavljanja tako da jednostavno ne uspije ako ode izvan korisničke mape ili tako nešto, i omogućavanjem dopuštenja.

Za stvaranje mape ako već ne postoji

Obzir okoliš pitanje.

  • WordPress.
  • Web hosting poslužitelj.
  • Pod pretpostavkom da Linux ne pokreće PHP.

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

Priručnik navodi da je jedini potrebni parametar $pathname!

tako da možemo jednostavno kodirati:

Obrazloženje:

Ne trebamo proslijediti nikakav parametar ili provjeriti postoji li mapa ili čak parametar načina prijenosa ako je potrebno; sljedeći razlozi:

  • Naredba će stvoriti mapu s dopuštenjem 0755 (zadano dopuštenje za javnu mapu) ili 0777, zadano dopuštenje za naredbu.
  • način se zanemaruje u Windows host koji pokreće PHP .
  • Naredba mkdir ima ugrađenu provjeru postoji li mapa; tako da samo trebamo provjeriti vraća li True | lažno; i ovo nije pogreška, to je samo upozorenje, a upozorenje je onemogućeno na hosting poslužiteljima prema zadanim postavkama.
  • Ovisno o brzini, brže je ako je upozorenje isključeno.

Ovo je drugi način gledanja na pitanje, a ne traženje najboljeg ili optimalnog rješenja.

Testirano na PHP7, proizvodnom poslužitelju, Linuxu

Također možete pokušati:

$dirpath = "put/do/dir"; $mode = "0777"; je_dir($dirpath) || mkdir($dirpath, $mode, true);

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

Više brz način stvaranje mape:

If (!is_dir("put/do/direktorija")) ( mkdir("put/do/direktorija", 0777, istina); )

Vi znate

Printf("Bok %s,
", $name);

prije instalacije kolačići, što je zabranjeno. Ne možete slati nikakve podatke prije zaglavlja, čak ni prazan redak.