Kotiin / Linuxin yleiskatsaus / Php toimii - Luo kansio, jos sitä ei vielä ole. Mkdir-funktio PHP:ssä, kuvaus ja esimerkkejä Php luo kansion, jos sitä ei ole olemassa

Php toimii - Luo kansio, jos sitä ei vielä ole. Mkdir-funktio PHP:ssä, kuvaus ja esimerkkejä Php luo kansion, jos sitä ei ole olemassa

Funktio mkdir() luo uuden kansion määritettyyn hakemistoon. Jos luominen onnistuu, palauttaa True. Kun luot uutta kansiota, voit asettaa sen käyttöoikeudet $mode-parametrilla. Asettamalla $recursive arvoon True, voit luoda useita alikansioita.

PHP versio 4 ja uudempi.

funktio bool mkdir(merkkijono $polkunimi [, int $mode [, bool $rekursiivinen [, resurssi $konteksti]]])

mkdir-funktion parametrit

$polkunimiPolku luotavaan hakemistoon.
$tilaLuodun kansion oikeudet määritetään oktaaliarvona, jonka alussa on pakollinen nolla (0777). Ensimmäistä nollaa lukuun ottamatta luvut edustavat omistajan, omistajaryhmän ja kaikkien muiden käyttöoikeustasoja.
Käyttöoikeustaso määräytyy numeroiden mukaan:
0 – pääsy kielletty;
1 – lukuoikeus;
2 – kirjoitusoikeus;
4 – toteutusoikeus.
Useimmiten oikeudet määritetään yhdistelmämääränä, esimerkiksi:
7 – täysi pääsy (1+2+4);
5 – lukeminen ja suoritus (1+4).
Oletusarvo on 0777.
$rekursiivinenBoolen parametri, joka määrittää, voidaanko sisäkkäisiä alihakemistoja luoda.
$kontekstiKäytetään virtojen kanssa työskennellessä. Lisätty PHP 5.0.0:aan.

Esimerkkejä mkdir-funktion käytöstä

mkdir( "uusi kansio" );

mkdir( "../uusi kansio" ); // yksi taso alaspäin

mkdir("/kansio1/kansio2/uusikansio" ); // koko polku

mkdir( "uusi kansio" , 0777); // luo kansio, jolla on oikeudet

Jos sinun on luotava useita alikansioita, sinun on asetettava $recursive = True.

mkdir("kansio1/kansio2/uusikansio" , 0777, tosi ); // kansion luominen nykyiseen hakemistoon


tämän artikkelin julkaiseminen on sallittua vain linkin kautta artikkelin kirjoittajan verkkosivustolle

Tässä artikkelissa kuvaan yhden vaihtoehdon kansioiden luomiseen liittyvän ongelman kiertämiseksi käyttämällä php:tä vikasietotilassa.
Kansion luomiseksi PHP:ssä on tavallinen mkdir()-funktio, mutta useimmissa tapauksissa se osoittautuu hyödyttömäksi ja monet ihmiset tietävät siitä, mutta harvat ihmiset eivät tiedä, että voit kiertää tämän ongelman.
Kaikki on hyvin yksinkertaista, sinun on luotava kansioita sisäänrakennetun avulla php toiminnot FTP.
Alla kirjoitan tästä tarkemmin.

Ongelmia mkdir():n kanssa kansiota luotaessa.
Kuten tiedät, jos se on käytössä php:ssä turvatilassa(safe_mode = päällä), kansioiden (hakemistojen) luominen käyttämällä mkdir() ei toimi. Tarkemmin sanottuna voit luoda sen, mutta tämän kansion käyttö on mahdotonta. Et voi ladata tiedostoja tähän kansioon, et voi nimetä sitä uudelleen etkä voi poistaa sitä, vaikka kirjautuisit sisään FTP:n kautta (joissakin tapauksissa voit poistaa FTP:n kautta).

Vikasietotila on oletusarvoisesti käytössä kaikilla palvelimilla ja isännöintipalveluntarjoajilla. Jos sinulla ei ole mahdollisuutta poistaa vikasietotilaa käytöstä, on toinen tapa.

Kansioiden luominen php:ssä FTP:n avulla.
Lähes kaikissa palvelimissa ja isännöissä on ftp-tuki käytössä php:ssä.
Näiden toimintojen avulla pääsemme kiertämään mkdir()-kansion luomisongelman.
Esimerkki kansion luomisesta FTP:n kautta.

$conn_id = @ ftp_connect ("ftp.server.ru" , 21 , 5 ); // muodostaa yhteyden FTP-palvelimeen
jos($conn_id) // Jos yhteys palvelimeen onnistui, jatka
{
$login_result = @ftp_login($conn_id, "käyttäjä", "passi"); // kirjoita FTP-tunnuksesi ja salasanasi
if($kirjautumistulos) // jos palvelin hyväksyi kirjautumissalasanan, siirry eteenpäin
{
// nyt sinun täytyy pelata passiivisella tilassa, kytkeä se päälle tai pois (TRUE, FALSE)
// jos muut ftp-toiminnot eivät toimi oikein, yritä muuttaa tätä parametria (TRUE tai FALE)
ftp_pasv($conn_id, TOSI); // Tässä tapauksessa passiivinen tila on käytössä
ftp_mkdir($conn_id, "1/2/3"); // ja itse kansion luominen
}
}
ftp_close($conn_id); // ja sulje FTP-yhteys
?>
Nyt ei ole suurta kommenttia koodiin.
Ensimmäinen rivi muodostaa yhteyden FTP-palvelimeen. Yleensä paikalliseen FTP-palvelimeen muodostamiseksi riittää, että määrität palvelimeksi localhost, mutta voit myös määrittää koko osoitteen.
Se, onko passiivinen tila käytössä vai pois käytöstä, riippuu FTP-asetuksista.

Kun luot kansiota, ole varovainen, kansio luodaan FTP-kirjautumisjuuresta. Eli polut täällä ovat erilaisia ​​kuin polut tiedostojärjestelmä ja kansio luodaan FTP:n kautta nähtynä.
Jos määrität kansiota luodessasi useita liitteitä, kuten esimerkissäni "1/2/3", niin tässä tapauksessa kaikki puuttuvat kansiot luodaan. Jos kansiota "1" ei ole, se luodaan, ja siihen luodaan kansio "2" ja siihen luodaan kansio "3". Jos välikansioita on jo olemassa, vain puuttuvat kansiot luodaan.
Ennen kansion luomista voit esimerkiksi siirtyä kansioon


Ja tämän toiminnon jälkeen voit luoda kansion. Jos kansion polku on määritetty "2/3" ilman kauttaviivaa, kansio luodaan suhteessa kansioon, jossa tällä hetkellä olemme. Eli kansio "1/2/3" luodaan


Jos määrität kenoviivan (/1/2/3) kansiota luodessasi, kansio luodaan FTP-juuresta riippumatta siitä, mihin kansioon olet siirtänyt.

Kommentit

14.10.2009 Sergei
kaikki nerokas on yksinkertaista :)

12.12.2009 Victor
Kiitos, kaikki toimii, mutta ftp-asiakasohjelmassa luodut kansiot eivät näy heti, se on käynnistettävä uudelleen, ts. älä vain katkaise yhteyttä palvelimeen ja muodosta yhteys uudelleen, vaan sulje ohjelma ja suorita se uudelleen (käytän FileZilla Clientiä).

14.12.2009 Ylläpitäjä
Luulen, että siinä kaikki FTP-asiakkaat välimuistitiedostot ja kansiot. Esimerkiksi Total Commanderissa on erityinen "päivitys"-painike tällaisia ​​​​asioita varten, on sääli, että FileZillalla ei ole tätä.

24.1.2010 Aleksanteri
Miksi FileZillassa ei ole sellaista, minulla on versio 3.2.2, se on jo noin vuoden vanha ja siellä on sellainen toiminto ja se on muistaakseni aina ollut!!!

27.8.2010 Vitaly
Kansiot luodaan 755:llä oikealla, mutta tarvitset 777:ää.
Onko luomisvaiheessa mahdollista jotenkin määrittää, millä oikeuksilla kansio luodaan FTP:n kautta?

27.8.2010 Ylläpitäjä
Vitaly, tätä varten on toiminto
ftp_chmod($conn_id, 0777, $tiedosto)
Kun olet luonut kansion tai tiedoston, käytä sitä

28.8.2010 Vitali
kiitos, Admin!

12.9.2010 Andrei
Anteeksi, miksi en luo useita hakemistoja, eli:

12.6.2011 Ilja
Jokin ei mene hyvin. Palvelimen ongelmat:
Varoitus: ftp_close() odottaa parametrin 1 olevan resurssi, boolean annettu rivillä 19 rivillä /home/bos/p/h/p/phpscripts/public_html/formf.php

15.6.2011 Victor
Ilja, hän kirjoittaa, että ensimmäinen parametri, jonka siirrät ftp_close-funktiolle, ei ole oikea

29.6.2011 Aleksei
Sama ongelma kuin Andreilla
(useita hakemistoja ei luoda)
ftp_mkdir ($conn_id, "1" // näin se toimii).
mutta kuten tämä ftp_mkdir ($conn_id, "1/2/3" // ei toimi).
???

27.7.2011 Victor
Aleksei, outoa, tarkistin, se luo useita kansioita minulle.
Ehkä jokin hankala tila on otettu käyttöön palvelimella, sitten sinun täytyy luoda kansiot yksitellen, ensin luoda kansio 1, sitten kirjoittaa se ja luoda kansio 2 siihen, sitten kirjoittaa kansio 2 ja luoda 3 siihen...

7.11.2011 k1-801 (Dmitry on mahdollista)
Ja kansioiden poistaminen, sikäli kuin ymmärrän, kautta
rmdir_ftp($conn_id, $dir);
Niin?

Ja muuten, jostain syystä se ei luo minulle kansiota (eikä kirjoita virheitä... outoa...)

3.10.2012 YA
Kiitos, muuten minua vaivasi tämä kysymys.
ja annat kaiken anteeksi ja pääasia että se toimii

29.5.2012 Mihail
Tietenkin olen pahoillani. Mihin minun pitäisi kirjoittaa tämä koodi, muuten en ole hyvä siinä, mutta minun on todella luotava kansio))

7.4.2012 Nomaq
Jokin minussa on vialla... ensimmäisen kerran koodi ohittaa, toisella kerralla se sanoo, että tällainen kansio on jo olemassa... näyttää siltä, ​​että sitä luodaan, mutta se ei näy edes FTP:n uudelleenkäynnistyksen jälkeen((((
ja myös, minun täytyy luoda kansio, joka ei ole samassa kansiossa, jossa PHP-tiedosto on, vaan palata yksi askel taaksepäin ja sitten kirjoittaa toinen kansio ja luoda se sinne.. jotain tällaista:
../folder1/new folder here
auttakaa, jos ei ole vaikeaa) kiitos)

7.4.2012 Nomaq
Keksin tavat))) kiitos yleisesti artikkelista, on harvinaista, että joku selittää kunnolla, miten)

27.01.2013 CiliZ
Hyvin tehty, kunnioitus artikkelia kohtaan

6.5.2013 Vasily
Yrityskansio on pääelementti yritysidentiteettiä yritykset. Se on tuote pienten asiakirjojen ja paperimateriaalien kiinnittämiseen. Kansioita käytetään sekä yrityksen sisällä, dokumentaation säilyttämiseen ja siirtämiseen että mainostarkoituksiin. Lisätietoja verkkosivulta: www.logodesigner.ru/papki

poista tunnisteet (12)

Olen törmännyt useisiin tapauksiin Bluehostin WordPress-asennuksissa, joissa törmäsin virheisiin WordPress-teemassani, koska lataukset wp-content/uploads -kansio puuttui.

Ilmeisesti Bluehost cPanel WP -asennusohjelma ei luo tätä kansiota, vaikka HostGator tekee.

Joten minun on lisättävä teemaani koodi, joka tarkistaa kansion ja luo sen muuten.

Vastaukset

Kokeile tätä:

If (!file_exists("polku/hakemistoon")) ( mkdir("polku/hakemistoon", 0777, tosi); )

Huomaa, että 0777 on jo hakemistojen oletustila, ja nykyinen umask voi silti muuttaa sitä.

WordPressissä on myös erittäin kätevä toiminto wp_mkdir_p, joka luo rekursiivisesti hakemistorakenteen.

Viitelähde: -

Funktio wp_mkdir_p($target) ( $wrapper = null; // poista protokolla if(wp_is_stream($target)) ( list($wrapper, $target) = explode("://", $target, 2); ) // osoitteesta php.net/mkdir käyttäjän tekemät muistiinpanot $target = str_replace("//", "/", $target // laita kääre takaisin kohteeseen if($wrapper !== null) ( $target). ); = "://" if (tyhjä($target)) $target = "/" " != $kohde_parent && ! is_dir($target_parent)) ( $kohde_parent = dirname($target_parent); ) // Hanki lupabitit. if ($stat = @stat($target_parent)) ( $dir_perms = $stat[ "mode"] & 0007777 aseta $dir_perms oikein komennolla 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; }

for ($i = 1; $i

Tarvitsen saman kirjautumissivustolle. Minun piti luoda hakemisto kahdella muuttujalla. $-hakemisto on pääkansio, johon halusin luoda toisen alikansion käyttäjän lisenssinumerolla.

Sisällytä_once(../include/session.php"); $lnum = $istunto->lnum; //Käyttäjälisenssinumero istunnoista $hakemisto = lähetetyt_tarrat; // Sen hakemiston nimi, johon kansiota luodaan if (!file_exists($hakemisto."/".$lnum)) ( mkdir($hakemisto."/".$lnum, 0777, true); )

Jotain yleisempää kuin se näkyy googlessa. Vaikka yksityiskohdat ovat tarkempia, tämän kysymyksen otsikko on yleisempi.

/** * luo rekursiivisesti pitkä hakemistopolku */ toiminto createPath($polku) ( if (is_dir($polku)) return true; $edellinen_polku = substr($polku, 0, strrpos($polku, "/", - 2) + 1); $return = createPath($prev_path)

Sitä voitaisiin parantaa antamalla pysäytystaso, joten se vain epäonnistuu, jos se menee käyttäjän kansion tai jotain ulkopuolelle, ja sallimalla käyttöoikeudet.

Kansion luominen, jos sitä ei vielä ole olemassa

Ympäristökysymyksen huomioiminen.

  • WordPress.
  • Web hosting-palvelin.
  • Olettaen, että Linuxissa ei ole PHP:tä.

bool mkdir(merkkijono $polkunimi[, int $mode=0777[, bool $recursive=FALSE[, resurssi$konteksti]]])

Käsikirjassa todetaan, että ainoa pakollinen parametri on $polkunimi !

joten voimme yksinkertaisesti koodata:

Selitys:

Meidän ei tarvitse välittää mitään parametria tai tarkistaa, onko kansio olemassa tai edes siirtotilaparametria tarvittaessa; seuraavista syistä:

  • Komento luo kansion, jonka käyttöoikeus on 0755 (julkisen kansion oletusoikeus) tai 0777, komennon oletusoikeus.
  • tila jätetään huomioimatta Windows-isäntä, jossa on PHP .
  • mkdir-komennolla on sisäänrakennettu tarkistus, onko kansio olemassa; joten meidän tarvitsee vain tarkistaa, onko palautettu True | Väärä; ja tämä ei ole virhe, se on vain varoitus, ja varoitus on oletusarvoisesti poistettu käytöstä isännöitävissä palvelimissa.
  • Nopeudesta riippuen se on nopeampi, jos varoitus on poistettu käytöstä.

Tämä on toinen tapa tarkastella kysymystä ja olla vaatimatta parasta tai optimaalista ratkaisua.

Testattu PHP7:llä, tuotantopalvelimella, Linuxilla

Voit myös kokeilla:

$dirpath = "polku/osoite/hakemisto"; $tila = "0777"; is_dir($dirpath) || mkdir($dirpath, $mode, true);

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

Nopeampi tapa luoda kansio:

If (!is_dir("polku/hakemistoon")) ( mkdir("polku/hakemistoon", 0777, tosi); )

sinä teet

Printf("Hei %s,
", $nimi);

ennen asennusta evästeet, joka on kielletty. Et voi lähettää tietoja ennen otsikoita, ei edes tyhjää riviä.

PHP:llä on yksi toiminto - mkdir(), jonka avulla voit luoda verkkosivustopalvelimelle hakemistoja, jotka ovat joskus niin tarpeellisia kotitaloudessa. Esimerkiksi kun luot uutta materiaalia, sinun on luotava sille kansio, johon lataat kaikki tarvittavat tiedostot uudelleen CMS:n avulla.

Mkdir("/polku/oma/hakemistoon", 0700);

Ne. tiettyyn hakemistoon luomme uuden kansion ja esimerkiksi asetamme sen tilaksi tilaan 0700, esimerkiksi jotta voimme kirjoittaa tiedostoja kansioon, vaihdamme tilaksi 0777.

Mutta tässä ilmenee ongelma mkdir():n kanssa. Kun teet tämän php-skripti kun safe_mode-palvelintoiminto on käytössä, omistaja (UID) tarkistetaan ja jos komentosarjan ja kansion omistaja eivät täsmää, et ehkä voi esimerkiksi kirjoittaa tiedostoa luotuun hakemistoon, poistaa tiedostoa siinä tai esimerkiksi FTP:n kautta et voi poistaa itse kansiota .

Mutta tähän ongelmaan on tyylikkäämpi ratkaisu ilman, että sinun tarvitsee pyytää isännöitsijää poistamaan safe_mode-toiminto puolestasi (tämä toiminto on oletuksena käytössä ehdottomasti kaikilla isännöintisivustoilla turvallisuuden takaamiseksi). Periaatteessa maksulliset isännöintipalvelut tarjoavat myös pääsyn ftp:hen, ja tästä lähdetään liikkeelle.

$conn_ftp = @ftp_connect("oma_ftp_palvelin", 21, 5);

Ensimmäinen muuttuja funktiossa on ftp-palvelimesi osoite, toinen on portti, jolla muodostat yhteyden ftp:hen ja viimeinen on sallittu yhteyden aikakatkaisu. Hieman aikakatkaisusta, se on tarpeen myöhempiä verkkotoimintoja varten, jos et syötä sitä, oletusarvoksi asetetaan 90 sekuntia. Yhteyden muodostamisen jälkeen tarkistamme onnistuiko se ja lähetämme käyttäjätunnuksen ja salasanan:

If($conn_ftp) // yhteys onnistui ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // anna FTP:n kirjautumistunnuksesi ja salasanasi if($login_result) // kirjautumistunnuksen ja salasanan vahvistus onnistui menestys(ftp_pasv($conn_ftp, TRUE);))

Kun olet tarkistanut kirjautumistunnuksen ja salasanan, meidän on päätettävä passiivisesta tilasta ja asetettava se arvoon TRUE tai FALSE - tämä on välttämätöntä, jos muut FTP-toiminnot eivät toimi oikein. Nyt passiivisen tilan määrittämisen jälkeen voimme luoda kansioitamme, kuvailen kaikki toiminnot, joista voi olla hyötyä sinulle tulevaisuudessa:

$tiedosto = ftp_mkdir($conn_ftp, "julkinen_html/materiaalit/345"); //Luodaan materiaalikansioon hakemistoa 345, jos materiaalikansiota ei ole olemassa, //se myös luodaan, samoin public_html-kansion kanssa (tämä hakemisto //on merkitty niin, että näet koko polun, muuten se on vain kansio jossa on sivusto) ftp_chdir($conn_ftp, "public_html/materials"); //Jos sinulla on ehdottomasti materiaalikansio, sinun ei tarvitse kirjoittaa koko //polkua, voit vain mennä siihen ensin ja luoda siihen kansion 345 käyttämällä //seuraavaa koodia ftp_mkdir ($conn_ftp, "345") ftp_chmod($ conn_ftp, 0777, $tiedosto); //Kaikki kansiot luodaan oletusarvoisesti tilassa 0755, tällä komennolla voit muuttaa //se 0777:ksi, jolloin voit lisätä tiedostoja luotuun kansioon.

Annan nyt täydellisen esimerkin toimivasta koodista, jotta voit nähdä, miltä se kaikki näyttää, esimerkiksi minun:

$dir_name = aika(); //Tässä luon kansion nimen skriptin käynnistysajan perusteella $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // yhteys onnistui ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // anna FTP:n kirjautumistunnuksesi ja salasanasi if($login_result) // kirjautumistunnuksen ja salasanan vahvistus onnistui menestys ( ftp_pasv ($conn_ftp, TRUE); ftp_chdir ($conn_ftp, "julkinen_html/materiaalit"); ftp_mkdir ($conn_ftp, $hakemiston_nimi); ftp_chmod($conn_ftp, 0777, $hakemiston_nimi); ) )

On myös syytä sanoa hieman hakemistojen määrittämisestä luotaessa, jos määrität kauttaviivan alussa, kansio luodaan suhteessa ftp-juureen. Kun muodostat yhteyden FTP-palvelimeen, muodostat aina yhteyden juuripalvelimeen, joten pidä tämä mielessä.