Hozzon létre egy mappát a php segítségével. A safe_mode = on direktíva, mkdir és mappák létrehozásával kapcsolatos problémák megoldása a szerveren. Példák az mkdir függvény használatára

02.04.2020 Biztonság

A PHP-nek egyetlen funkciója van - az mkdir(), amely lehetővé teszi könyvtárak létrehozását a webhely szerverén, amelyek néha annyira szükségesek a háztartásban. Például egy új anyag létrehozásakor létre kell hozni egy mappát, ahová ismét a CMS segítségével feltöltheti az összes szükséges fájlt.

Mkdir("/útvonal/a/saját/könyvtárhoz", 0700);

Azok. egy bizonyos könyvtárban hozzuk létre új mappaés például 0700 módra állítjuk, például hogy tudjunk fájlokat írni a mappába, a módot 0777-re állítjuk.

De itt adódik az mkdir() probléma. Ha ezt a php szkriptet a safe_mode szerver funkcióval futtatja, akkor a tulajdonos (UID) ellenőrzésre kerül, és ha a szkript és a mappa tulajdonosa nem egyezik, akkor előfordulhat, hogy nem tud például fájlt írni a létrehozott könyvtárba, töröljön egy fájlt benne, vagy például FTP-n keresztül Ön nem tudja magát a mappát törölni.

De van erre a problémára egy elegánsabb megoldás is, anélkül, hogy meg kellene kérnie a hostot, hogy tiltsa le a safe_mode funkciót ( ezt a funkciót alapértelmezés szerint az összes tárhelyen engedélyezve van a biztonság érdekében). Alapvetően fizetett tárhely Az ftp-hez is hozzáférést biztosítanak, mi ebből indulunk ki.

$conn_ftp = @ftp_connect("saját_ftp_szerver", 21, 5);

A függvény első változója az ftp-szerver címe, a második az a port, amelyen csatlakozik az ftp-hez, az utolsó pedig a megengedett kapcsolódási időtúllépés. Egy kicsit az időtúllépésről, a későbbi hálózati műveletekhez szükséges, ha nem adja meg, akkor az alapértelmezett érték 90 másodperc. A csatlakozás után ellenőrizzük, hogy sikeres volt-e, és elküldjük a bejelentkezési nevet és a jelszót:

If($conn_ftp) // a csatlakozás sikeres volt ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // írja be az FTP bejelentkezési nevét és jelszavát if($login_result) // a bejelentkezés és a jelszó ellenőrzése sikeres siker(ftp_pasv($conn_ftp, TRUE);))

A bejelentkezési név és a jelszó ellenőrzése után döntenünk kell a passzív mód mellett, és azt IGAZ vagy FALSE értékre kell állítani - ez akkor szükséges, ha további FTP funkciók nem működnek megfelelően. Most a passzív mód meghatározása után létrehozhatjuk a mappáinkat, leírom az összes olyan funkciót, ami a jövőben hasznos lehet:

$file = ftp_mkdir($conn_ftp, "public_html/materials/345"); //A 345-ös könyvtár létrehozása az anyagok mappában, ha az anyagok mappa nem létezik, //az is létrejön, ugyanígy a public_html mappával (ez a //könyvtár azért van feltüntetve, hogy a teljes elérési utat láthassa, különben csak egy mappa webhelytel) ftp_chdir($conn_ftp, "public_html/materials"); //Ha biztosan van anyagok mappája, akkor nem kell a teljes //elérési utat beírnia, először csak rá kell mennie, majd létrehozhat benne egy 345-ös mappát //a következő kóddal: ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $fájl); //Az összes mappa alapértelmezés szerint a 0755-ös móddal jön létre, ezt a parancsot lehetővé teszi, hogy módosítsa // 0777-re, ami lehetővé teszi, hogy fájlokat adjon hozzá a létrehozott mappához.

Most adok egy teljes példát a működő kódra, így láthatja, hogyan néz ki az egész, például az enyém:

$dir_name = idő(); //Itt létrehozom a mappa nevét a szkript indításának időpontja alapján $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // a kapcsolódás sikeres volt ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // adja meg FTP-hez való bejelentkezési nevét és jelszavát if($login_result) // a bejelentkezés és a jelszó ellenőrzése sikeres siker ( 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); ) )

Érdemes még néhány szót ejteni a könyvtárak létrehozásánál, ha az elején perjelet adunk meg, akkor a mappa az ftp gyökérhez viszonyítva jön létre. Amikor csatlakozik a FTP szerver mindig a gyökérhez csatlakozol, ezért tartsd ezt szem előtt.

Az mkdir() függvény új mappát hoz létre a megadott könyvtárban. Ha a létrehozás sikeres, a True értéket adja vissza. Új mappa létrehozásakor a $mode paraméterrel beállíthatunk hozzá hozzáférési jogokat. A $recursive True értékre állításával több almappát is létrehozhat.

PHP 4-es és újabb verzió.

függvény bool mkdir(string $pathname [, int $mode [, bool $rekurzív [, erőforrás $kontextus]]])

mkdir függvény paraméterei

$elérési útnévA létrehozandó könyvtár elérési útja.
$módA létrehozott mappához fűződő jogok A jogok oktális értékként vannak hozzárendelve, és először egy kötelező nulla (0777). Az első nullán kívül a számok a tulajdonos, a tulajdonos csoportja és mindenki más hozzáférési szintjeit jelentik.
A hozzáférési szintet a számok határozzák meg:
0 – hozzáférés megtagadva;
1 – olvasási hozzáférés;
2 – írási hozzáférés;
4 – végrehajtási hozzáférés.
Leggyakrabban a jogokat összetett összegként adják meg, például:
7 – teljes hozzáférés (1+2+4);
5 – olvasás és végrehajtás (1+4).
Az alapértelmezett érték 0777.
$rekurzívLogikai paraméter, amely meghatározza, hogy létrehozhatók-e beágyazott alkönyvtárak.
$kontextusA folyamokkal való munka során használatos. PHP 5.0.0-ban hozzáadva.

Példák az mkdir függvény használatára

mkdir( "új mappa" );

mkdir( "../új mappa" ); // egy szinttel lejjebb

mkdir("/mappa1/mappa2/újmappa" ); // teljes útvonal

mkdir( "újmappa" , 0777); // hozzon létre egy mappát hozzárendelt jogokkal

Ha több almappát kell létrehoznia, akkor a $recursive = True értéket kell beállítani.

mkdir("mappa1/mappa2/újmappa" , 0777, igaz ); // mappa létrehozása az aktuális könyvtárban

címkék eltávolítása (12)

Több olyan esettel is találkoztam WordPress telepítések a Bluehost-tal, ahol hibákat tapasztaltam az én WordPress téma mert hiányzott a wp-content/uploads uploads mappa.

Nyilvánvalóan a Bluehost cPanel WP telepítője nem hozza létre ezt a mappát, bár a HostGator igen.

Tehát kódot kell hozzáadnom a témámhoz, amely ellenőrzi a mappát, és egyébként létrehozza azt.

Válaszok

Próbáld ki:

If (!file_exists("könyvtár/útvonal")) ( mkdir("könyvtár/útvonal", 0777, igaz); )

Ne feledje, hogy a 0777 már az alapértelmezett mód a könyvtárakhoz, és az aktuális umask továbbra is megváltoztathatja.

A WordPressnek van egy nagyon praktikus wp_mkdir_p funkciója is, amely rekurzív módon létrehoz egy könyvtárstruktúrát.

Referencia forrása: -

Függvény wp_mkdir_p($target) ( $wrapper = null; // a protokoll eltávolítása if(wp_is_stream($target)) ( list($wrapper, $target) = explode("://", $target, 2); ) // innen: php.net/mkdir felhasználói megjegyzések $target = str_replace("//", "/", $target); // a burkoló visszahelyezése a célpontra if($wrapper !== null) ( $target = $csomagoló a formatting.php függőség elkerülése érdekében. if (empty($target)) $target = "/"; if (file_exists($target)) return @is_dir($target); // Meg kell találnunk a szülőmappa engedélyeit $target_parent = dirname($target); while ("." != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // Szerezze be az engedélybiteket. if ($stat = @stat($target_parent)) ( $dir_perms = $stat["mode"] & 0007777; ) else ( $dir_perms = 0777; ) if (@mkdir($target, $dir_perms, true)) ( // Ha egy umask van beállítva, amely módosítja a $dir_perms paramétert, akkor a $dir_perms paramétert újra kell helyesen beállítani a chmod() segítségével if ($dir_perms != ($dir_perms & ~umask())) ( $folder_parts = explode( "/", substr($cél, strlen($cél_szülő) + 1)); for ($i = 1; $i<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

Ugyanez kell a bejelentkezési oldalhoz is. Létre kellett hoznom egy könyvtárat két változóval. A $ könyvtár az a főmappa, ahol egy másik almappát akartam létrehozni a felhasználói licencszámmal.

Include_once(../include/session.php"); $lnum = $munkamenet->lnum; //Felhasználói licenc száma a munkamenetekből $könyvtár = feltöltött_címkék; // A mappa létrehozása alatt álló könyvtár neve if (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Valami általánosabb, ahogy a google-n megjelenik. Míg a részletek konkrétabbak, a kérdés címe általánosabb.

/** * rekurzívan hozzon létre egy hosszú könyvtárútvonalat */ függvény 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; )

Ez egy olyan utat fog bevinni, amely valószínűleg egy hosszú láncolattal nem létrehozott könyvtárakat tartalmaz, és tovább halad egy könyvtárral feljebb, amíg egy meglévő könyvtárba nem kerül. Ezután megpróbálja létrehozni a következő könyvtárat abban a könyvtárban, és addig folytatja, amíg az összes könyvtár létre nem jön. Siker esetén igazat ad vissza.

Javítható egy leállítási szint megadásával, így egyszerűen meghibásodik, ha kívülre kerül a felhasználó mappáján vagy valamin, és engedélyezi az engedélyeket.

Mappa létrehozása, ha még nem létezik

Megfontolás környezet kérdés.

  • WordPress.
  • Web hosting szerver.
  • Feltéve, hogy a Linuxon nem fut a PHP.

bool mkdir(string $elérési útnév[, int $mode=0777[, bool $recursive=FALSE[, erőforrás$kontextus]]])

A kézikönyv szerint az egyetlen kötelező paraméter a $pathname !

így egyszerűen kódolhatjuk:

Magyarázat:

Nem kell semmilyen paramétert átadnunk, és nem kell ellenőriznünk, hogy létezik-e a mappa, sőt, ha szükséges, még az átviteli mód paraméterét sem; a következő okok miatt:

  • A parancs létrehoz egy mappát 0755 (a nyilvános mappák alapértelmezett engedélye) vagy 0777, a parancs alapértelmezett engedélyével.
  • mód figyelmen kívül hagyva PHP-t futtató Windows gazdagép .
  • Az mkdir parancs beépített ellenőrzővel rendelkezik, ha a mappa létezik; így csak azt kell ellenőriznünk, hogy a True | Hamis; és ez nem hiba, csak figyelmeztetés, és a figyelmeztetés alapértelmezés szerint le van tiltva a hosting szervereken.
  • Sebességtől függően gyorsabb, ha a figyelmeztetés ki van kapcsolva.

Ez egy másik módja annak, hogy megvizsgáljuk a kérdést, és ne a legjobb vagy optimális megoldást keressük.

Tesztelve PHP7-en, Production Serveren, Linuxon

Kipróbálhatod még:

$dirpath = "útvonal/könyvtár"; $mode = "0777"; is_dir($dirpath) || mkdir($dirpath, $mode, true);

If (!is_dir("elérési_könyvtár")) ( @mkdir("elérési_könyvtár"); )

Több gyors út mappa létrehozása:

If (!is_dir("könyvtár/útvonal")) ( mkdir("könyvtár/útvonal", 0777, igaz); )

Te teszed

Printf("Szia %s!
", $név);

telepítés előtt sütiket, ami tilos. A fejlécek előtt nem küldhet adatot, még üres sort sem.