Safe_mode = në direktivë, mkdir dhe zgjidhja e problemeve me krijimin e dosjeve në server. Funksioni Mkdir në PHP, përshkrimi dhe shembuj Php duke krijuar një dosje me një numër vijues

Funksioni mkdir() krijon një dosje të re në drejtorinë e specifikuar. Nëse krijimi është i suksesshëm, kthen True. Kur krijoni një dosje të re, mund të vendosni të drejtat e hyrjes në të duke përdorur parametrin $mode. Duke vendosur $recursive në True, ju mund të krijoni nënfoldera të shumta.

PHP versioni 4 dhe më i lartë.

funksion bool mkdir(vargu $pathname [, int $mode [, bool $rekursive [, burimi $context]]])

parametrat e funksionit mkdir

$ pathnameRruga drejt drejtorisë që do të krijohet.
$modeTë drejtat në dosjen e krijuar caktohen si një vlerë oktale me një zero të detyrueshme në radhë të parë (0777). Përveç zeros së parë, numrat përfaqësojnë nivelet e aksesit për pronarin, për grupin e pronarit, për të gjithë të tjerët.
Niveli i aksesit përcaktohet nga numrat:
0 – qasja e refuzuar;
1 – akses për lexim;
2 – akses shkrimi;
4 – qasja në ekzekutim.
Më shpesh, të drejtat përcaktohen si një shumë e përbërë, për shembull:
7 – akses i plotë (1+2+4);
5 – lexim dhe ekzekutim (1+4).
Vlera e paracaktuar është 0777.
$rekurziveNjë parametër Boolean që përcakton nëse mund të krijohen nëndrejtori të ndërlidhura.
$kontekstPërdoret kur punoni me prurje. Shtuar në PHP 5.0.0.

Shembuj të përdorimit të funksionit mkdir

mkdir( "dosje e re" );

mkdir( "../dosje e re" ); // një nivel më poshtë

mkdir ("/folder1/folder2/newfolder" ); // rrugë e plotë

mkdir( "newfolder" , 0777); // krijoni një dosje me të drejta të caktuara

Nëse keni nevojë të krijoni nëndosje të shumta, duhet të vendosni $rekursive = True.

mkdir ("folder1/folder2/newfolder" , 0777, E vërtetë); // krijimi i një dosjeje në drejtorinë aktuale

PHP ka një funksion të vetëm - mkdir(), i cili ju lejon të krijoni direktori në serverin e faqes së internetit, të cilat ndonjëherë janë aq të nevojshme në familje. Për shembull, kur krijoni një material të ri, duhet të krijoni një dosje për të, ku, përsëri duke përdorur CMS-në tuaj, do të ngarkoni të gjithë skedarët e nevojshëm.

Mkdir ("/rruga/to/my/dir", 0700);

ato. në një drejtori të caktuar krijojmë një dosje të re dhe, për shembull, vendosim modalitetin e saj në modalitetin 0700, për shembull, në mënyrë që të mund të shkruajmë skedarë në dosje, ne ndryshojmë modalitetin në 0777.

Por këtu lind problemi me mkdir(). Kur ekzekutoni këtë skript php me funksionin e serverit safe_mode të aktivizuar, kontrollohet pronari (UID) dhe nëse pronari i skriptit dhe dosja nuk përputhen, atëherë mund të mos jeni në gjendje, për shembull, të shkruani një skedar në skedarin e krijuar. drejtoria, fshini një skedar në të, ose, për shembull, nëpërmjet FTP ju nuk do të mund ta fshini vetë dosjen.

Por ka një zgjidhje më elegante për këtë problem, pa qenë nevoja t'i kërkoni hosterit që të çaktivizojë funksionin safe_mode për ju (ky funksion është aktivizuar absolutisht në të gjitha faqet e pritjes si parazgjedhje, për të garantuar sigurinë). Në thelb, shërbimet e pritjes me pagesë ofrojnë gjithashtu akses në ftp, dhe kjo është ajo nga e cila do të fillojmë.

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

Ndryshorja e parë në funksion është adresa e serverit tuaj ftp, e dyta është porta në të cilën lidheni me ftp dhe e fundit është koha e lejuar e lidhjes. Pak për afatin, është e nevojshme për operacionet e mëvonshme të rrjetit nëse nuk e futni atë, atëherë vlera e paracaktuar është vendosur në 90 sekonda. Pas lidhjes, ne kontrollojmë nëse ishte e suksesshme dhe dërgojmë hyrjen dhe fjalëkalimin:

Nëse ($conn_ftp) // lidhja ishte e suksesshme ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // shkruani hyrjen dhe fjalëkalimin për FTP nëse ($login_result) // verifikimi i hyrjes dhe fjalëkalimit kaloi sukses (ftp_pasv ($conn_ftp, E VËRTETË);))

Pas kontrollit të hyrjes dhe fjalëkalimit, duhet të vendosim për modalitetin pasiv dhe ta vendosim atë në TRUE ose FALSE - kjo është e nevojshme nëse funksionet e mëtejshme FTP nuk do të funksionojnë siç duhet. Tani pas përcaktimit të modalitetit pasiv, ne mund të krijojmë dosjet tona, unë do të përshkruaj të gjitha funksionet që mund të jenë të dobishme për ju në të ardhmen:

$file = ftp_mkdir($conn_ftp, "public_html/materials/345"); //Krijimi i drejtorisë 345 në dosjen e materialeve, nëse dosja e materialeve nuk ekziston, //do të krijohet gjithashtu, e njëjta gjë me dosjen public_html (kjo drejtori // tregohet në mënyrë që të mund të shihni të gjithë shtegun, përndryshe është vetëm një dosje me sajtin) ftp_chdir($conn_ftp, "public_html/materials"); //Nëse padyshim keni një dosje materialesh, atëherë nuk keni pse të shkruani të gjithë //shtegun, thjesht mund të shkoni fillimisht tek ajo dhe më pas të krijoni një dosje 345 në të duke përdorur //kodin e mëposhtëm ftp_mkdir ($conn_ftp, "345") ftp_chmod ($ conn_ftp, 0777, $file); //Të gjitha dosjet janë krijuar me modalitetin 0755 si parazgjedhje, kjo komandë do t'ju lejojë të ndryshoni //it në 0777, e cila do t'ju lejojë të shtoni skedarë në dosjen e krijuar.

Tani do të jap një shembull të plotë të kodit të punës në mënyrë që të mund të shihni se si duket e gjitha, për shembull, e imja:

$dir_name = koha(); //Këtu krijoj emrin e dosjes bazuar në kohën kur u lançua skripti $conn_ftp = @ftp_connect("your_ftp_server", 21, 5); if($conn_ftp) // lidhja ishte e suksesshme ( $login_result = @ftp_login($conn_ftp, "user", "pass"); // shkruani hyrjen dhe fjalëkalimin tuaj për FTP if($login_result) // identifikimi dhe verifikimi i fjalëkalimit kaloi sukses ( ftp_pasv ($conn_ftp, E VËRTETË); ftp_chdir ($conn_ftp, "public_html/materials"); ftp_mkdir ($conn_ftp, $dir_name); ftp_chmod ($conn_ftp, 0777, $dir_name); ) )

Vlen gjithashtu të thuhet pak për specifikimin e drejtorive gjatë krijimit nëse specifikoni një prerje në fillim, dosja do të krijohet në lidhje me rrënjën ftp. Kur lidheni me një server FTP, gjithmonë jeni duke u lidhur me rrënjën, kështu që mbani në mend këtë.

hiqni etiketat (12)

Kam hasur disa raste me instalimet e WordPress nga Bluehost ku kam hasur gabime në temën time të WordPress sepse mungonte dosja e ngarkimeve wp-content/uploads.

Me sa duket, instaluesi i Bluehost cPanel WP nuk e krijon këtë dosje, megjithëse HostGator e krijon.

Kështu që më duhet të shtoj kod në temën time që kontrollon dosjen dhe e krijon atë ndryshe.

Përgjigjet

Provoje:

Nëse (!file_exists("rruga/në/direktoria")) ( mkdir("rruga/drejt/drejtoria", 0777, e vërtetë); )

Vini re se 0777 është tashmë mënyra e paracaktuar për drejtoritë dhe mund të ndryshohet ende nga umask aktual.

WordPress gjithashtu ka një funksion shumë të dobishëm wp_mkdir_p i cili do të krijojë në mënyrë rekursive një strukturë drejtorie.

Burimi për referencë: -

Funksioni wp_mkdir_p($target) ( $wrapper = null; // zhvesh protokollin if(wp_is_stream($target)) (lista($wrapper, $target) = explode("://", $target, 2); ) // nga php.net/mkdir shënimet e kontribuuara nga përdoruesi $target = str_replace("//", "/", $target // vendoseni mbështjellësin përsëri në objektivin if($wrapper !== null) ( $target $wrapper ) // dështon me një vijë të pjerrët në disa versione të PHP-së ($target, "/"); if (empty($target)) $target = "/" if (file_exists($target)) ktheje @is_dir($target) dhe trashegoje ate $target($target); " != $target_parent && ! is_dir($target_parent)) ( $target_parent = dirname($target_parent); ) // Merrni bitet e lejes. if ($stat = @stat($target_parent)) ( $dir_perms = $stat[ "mode"] & 0007777; vendosni saktë $dir_perms me chmod() if ($dir_perms != ($dir_perms & ~umask())) ($folder_parts = explode( "/", substr($target, strlen($target_parent) + 1)); për ($i = 1; $i<= count($folder_parts); $i++) { @chmod($target_parent . "/" . implode("/", array_slice($folder_parts, 0, $i)), $dir_perms); } } return true; } return false; }

Më duhet e njëjta gjë për faqen e hyrjes. Më duhej të krijoja një drejtori me dy variabla. Drejtoria $ është dosja kryesore ku doja të krijoja një nënfolder tjetër me numrin e licencës së përdoruesve.

Include_once("../include/session.php"); $lnum = $sesion->lnum; //Numri i licencës së përdoruesve nga sesionet $directory = ngarkuar_etiketat; // Emri i drejtorisë në të cilën dosja po krijohet nëse (!file_exists($directory."/".$lnum)) ( mkdir($directory."/".$lnum, 0777, true); )

Diçka më gjenerike siç shfaqet në google. Ndërsa detajet janë më specifike, titulli i kësaj pyetjeje është më i përgjithshëm.

/** * krijoni në mënyrë rekursive një shteg të gjatë direktoriumi */ funksioni createPath($path) (nëse (is_dir($path)) kthehet i vërtetë; $prev_path = substr($rrugë, 0, strrpos($rrugë, "/", - 2) + 1 $return = createPath($prev_path ($return && is_writable($prev_path)) : false;

Kjo do të marrë një rrugë me ndoshta një zinxhir të gjatë drejtorish të pakrijuara dhe do të vazhdojë të lëvizë lart një drejtori derisa të përfundojë në një drejtori ekzistuese. Më pas do të përpiqet të krijojë drejtorinë tjetër brenda asaj drejtorie dhe do të vazhdojë derisa të krijohen të gjitha drejtoritë. Ajo kthehet e vërtetë nëse është e suksesshme.

Mund të përmirësohet duke ofruar një nivel ndalimi, kështu që thjesht dështon nëse del jashtë dosjes së përdoruesit ose diçka tjetër, dhe duke aktivizuar lejet.

Për të krijuar një dosje nëse nuk ekziston tashmë

Shqyrtimi i çështjes mjedisore.

  • WordPress.
  • Web hosting server.
  • Duke supozuar se Linux nuk po ekzekuton PHP.

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

Manuali thotë se i vetmi parametër i kërkuar është $pathname !

kështu që ne thjesht mund të kodojmë:

Shpjegim:

Nuk kemi nevojë të kalojmë asnjë parametër apo të kontrollojmë nëse dosja ekziston apo edhe parametri i modalitetit të transferimit nëse është e nevojshme; arsyet e mëposhtme:

  • Komanda do të krijojë një dosje me lejen 0755 (leja e paracaktuar për një dosje publike) ose 0777, leja e paracaktuar për komandën.
  • modaliteti është injoruar në Pritësi i Windows që ekzekuton PHP .
  • Komanda mkdir ka një kontroll të integruar nëse dosja ekziston; kështu që ne vetëm duhet të kontrollojmë për kthimin e True | I rremë; dhe ky nuk është një gabim, është vetëm një paralajmërim, dhe paralajmërimi është i çaktivizuar në serverët pritës si parazgjedhje.
  • Në varësi të shpejtësisë, është më e shpejtë nëse paralajmërimi është i çaktivizuar.

Kjo është një mënyrë tjetër për të parë pyetjen dhe për të mos pretenduar zgjidhjen më të mirë apo optimale.

Testuar në PHP7, Server Prodhimi, Linux

Ju gjithashtu mund të provoni:

$dirpath = "rruga/në/dir"; $mode = "0777"; is_dir($dirpath) || mkdir ($dirpath, $mode, e vërtetë);

Nëse (!is_dir("direct_path")) ( @mkdir ("direct_path"); )

Një mënyrë më e shpejtë për të krijuar një dosje:

Nëse (!is_dir("rruga/në/direktoria")) ( mkdir("rruga/drejt/drejtoria", 0777, e vërtetë); )

Ju bëni

Printf("Përshëndetje %s,
", $name);

përpara se të instaloni cookies, gjë që është e ndaluar. Ju nuk mund të dërgoni asnjë të dhënë përpara titujve, madje as një rresht bosh.


publikimi i këtij artikulli lejohet vetëm me një lidhje në faqen e internetit të autorit të artikullit

Në këtë artikull, unë do të përshkruaj një opsion për të zgjidhur problemin e krijimit të dosjeve duke përdorur php në modalitetin e sigurt.
Për të krijuar një dosje në PHP, ekziston një funksion standard mkdir(), por në shumicën e rasteve rezulton të jetë i padobishëm dhe shumë njerëz e dinë për të, por jo shumë njerëz e dinë që ju mund ta zgjidhni këtë problem.
Gjithçka është shumë e thjeshtë, ju duhet të krijoni dosje duke përdorur funksionet FTP të integruara në php.
Më poshtë shkruaj për këtë në mënyrë më të detajuar.

Probleme me mkdir() kur krijoni një dosje.
Siç e dini, nëse modaliteti i sigurt është aktivizuar në php (safe_mode = aktivizuar), atëherë krijimi i dosjeve (drejtorive) duke përdorur mkdir() nuk do të funksionojë. Për të qenë më të saktë, ju mund ta krijoni atë, por përdorimi i mëtejshëm i kësaj dosjeje do të jetë i pamundur. Nuk do të mund të ngarkoni skedarë në këtë dosje, nuk do të mund ta riemërtoni dhe nuk do të mund ta fshini, edhe nëse hyni përmes FTP (në disa raste mund ta fshini përmes FTP).

Modaliteti i sigurt është aktivizuar si parazgjedhje në të gjithë serverët dhe të gjithë ofruesit e pritjes. Nëse nuk keni mundësinë për të çaktivizuar modalitetin e sigurt, ekziston një rrugëdalje tjetër.

Krijimi i dosjeve në php duke përdorur FTP.
Pothuajse të gjithë serverët dhe hostet kanë mbështetje për ftp të aktivizuar në php.
Me ndihmën e këtyre funksioneve do të kapërcejmë problemin e krijimit të dosjes mkdir().
Një shembull i krijimit të një dosje përmes FTP.

$conn_id = @ ftp_connect ("ftp.server.ru" , 21 , 5 ); // lidheni me serverin FTP
nëse ($conn_id) // nëse lidhja me serverin ishte e suksesshme, vazhdoni
{
$login_result = @ftp_login($conn_id, "user", "pass"); // shkruani hyrjen dhe fjalëkalimin tuaj për FTP
if ($login_result) // nëse serveri pranoi fjalëkalimin e hyrjes, vazhdo
{
// tani duhet të luani me modalitetin pasiv, ta aktivizoni ose çaktivizoni atë (E VËRTETË, E FALSE)
// nëse funksionet e mëtejshme ftp nuk funksionojnë siç duhet, provoni ta ndryshoni këtë parametër (TRUE ose FALE)
ftp_pasv ($conn_id, E VËRTETË); // në këtë rast është aktivizuar modaliteti pasiv
ftp_mkdir ($conn_id, "1/2/3"); // dhe vetë krijimi i dosjes
}
}
ftp_close ($conn_id); // dhe mbyllni lidhjen FTP
?>
Tani jo një koment i madh për kodin.
Rreshti i parë lidhet me serverin FTP. Zakonisht, për t'u lidhur me një server lokal FTP, mjafton të specifikoni localhost si server, por gjithashtu mund të specifikoni adresën e plotë.
Nëse modaliteti pasiv është i aktivizuar ose i çaktivizuar varet nga cilësimet e FTP.

Kur krijoni një dosje, kini kujdes, dosja është krijuar nga rrënja e hyrjes FTP. Kjo do të thotë, shtigjet këtu ndryshojnë nga shtigjet e sistemit të skedarëve dhe dosja krijohet siç shihet përmes FTP.
Nëse kur krijoni një dosje, specifikoni disa bashkëngjitje, si në shembullin tim "1/2/3", atëherë në këtë rast do të krijohen të gjitha dosjet që mungojnë. Nëse nuk ka dosje "1", do të krijohet dhe në të do të krijohet dosja "2" dhe në të do të krijohet dosja "3". Nëse dosjet e ndërmjetme ekzistojnë tashmë, atëherë do të krijohen vetëm ato që mungojnë.
Përpara se të krijoni një dosje, mund të kaloni te një dosje, për shembull


Dhe pas këtij funksioni mund të krijoni një dosje. Nëse shtegu për në dosje është specifikuar si "2/3" pa vijën e pjerrët kryesore, atëherë dosja do të krijohet në lidhje me dosjen në të cilën ndodhemi aktualisht. Kjo do të thotë, do të krijohet dosja "1/2/3".


Nëse specifikoni një vijë të pjerrët kryesore (/1/2/3) kur krijoni një dosje, dosja do të krijohet nga rrënja FTP, pavarësisht se në cilin dosje keni lëvizur.

Komentet

14.10.2009 Sergej
cdo gje e zgjuar eshte e thjeshte :)

12.12.2009 Viktor
Faleminderit, gjithçka funksionon, por në klientin ftp dosjet e krijuara nuk duken menjëherë, duhet ta rinisni, d.m.th. jo thjesht shkëputeni nga serveri dhe lidheni përsëri, por mbylleni programin dhe ekzekutoni përsëri (Unë përdor FileZilla Client).

14.12.2009 Admin
Unë mendoj se të gjithë klientët FTP ruajnë skedarët dhe dosjet. Për shembull, në Total Commander ekziston një buton i veçantë "përditësimi" për çështje të tilla është turp që FileZilla nuk e ka këtë.

24.01.2010 Aleksandër
Si nuk ka një gjë të tillë në FileZilla, unë kam versionin 3.2.2, tashmë është rreth një vjeç dhe ka një funksion të tillë dhe me sa mbaj mend ka qenë gjithmonë!!!

27.08.2010 Vitaly
Dosjet krijohen me 755 në të djathtë, por ju duhen 777.
Në fazën e krijimit, a është e mundur të konfiguroni disi se cilat të drejta do të krijohet dosja përmes FTP?

27.08.2010 Admin
Vitaly, ekziston një funksion për këtë
ftp_chmod ($conn_id, 0777, $file)
pasi të krijoni një dosje ose skedar, përdorni atë

28.08.2010 Vitaly
faleminderit Admin!

09/12/2010 Andrey
Më falni, pse nuk krijoj disa drejtori, domethënë:

06/12/2011 Ilya
Diçka nuk po shkon mirë. Problemet e serverit:
Paralajmërim: ftp_close() pret që parametri 1 të jetë burim, boolean i dhënë në /home/bos/p/h/p/phpscripts/public_html/formf.php në linjën 19

15.06.2011 Viktor
Ilya, ai shkruan se parametri i parë që po kalon te funksioni ftp_close nuk është i saktë

29.06.2011 Alexey
I njëjti problem si Andrei
(shumë drejtori nuk janë krijuar)
ftp_mkdir ($conn_id, "1" // kështu funksionon
por si kjo ftp_mkdir ($conn_id, "1/2/3") nuk funksionon.
???

27.07.2011 Viktor
Alexey, e çuditshme, kontrollova, krijon disa dosje për mua.
Ndoshta në server është aktivizuar ndonjë modalitet i ndërlikuar, atëherë duhet të krijoni dosje një nga një, së pari të krijoni dosjen 1, pastaj futeni atë dhe krijoni dosjen 2 në të, pastaj futni dosjen 2 dhe krijoni 3 në të...

11/07/2011 k1-801 (Dmitry është i mundur)
Dhe për të fshirë dosjet, me sa kuptoj, përmes
rmdir_ftp ($conn_id, $dir);
Kështu që?

Dhe, nga rruga, për disa arsye nuk krijon një dosje për mua (dhe nuk shkruan gabime ... e çuditshme ...)

03/10/2012 YA
Faleminderit, përndryshe u mundova me këtë pyetje.
dhe ju falni gjithçka dhe gjëja kryesore është se funksionon

29.05.2012 Mikhail
Sigurisht që më vjen keq. Ku duhet ta shkruaj këtë kod, përndryshe nuk jam aspak i mirë në të, por me të vërtetë duhet të krijoj një dosje))

07/04/2012 Nomaq
Diçka nuk shkon me mua... herën e parë kalon kodi, herën e dytë thotë që tashmë ekziston një dosje e tillë... duket sikur po krijohet, por nuk duket as pas rinisjes së FTP((((
dhe gjithashtu, më duhet të krijoj një dosje jo në të njëjtën dosje ku është skedari PHP, por të kthehem një hap prapa dhe më pas të fut në një dosje tjetër dhe ta krijoj atje.. diçka si kjo:
../folder1/dosje e re këtu
ju lutemi ndihmoni, nëse jo e vështirë) faleminderit)

07/04/2012 Nomaq
I kuptova mënyrat))) faleminderit në përgjithësi për artikullin, është e rrallë që dikush të shpjegojë siç duhet se si)))

27.01.2013 CiliZ
Bravo, respekt për artikullin

06/05/2013 Vasily
Një dosje korporative është elementi kryesor i identitetit korporativ të një kompanie. Është një produkt për bashkimin e sasive të vogla të dokumenteve dhe materialeve letre. Dosjet përdoren si brenda një kompanie, për ruajtjen dhe lëvizjen e dokumentacionit dhe për qëllime reklamimi. Më shumë detaje në faqen e internetit: www.logodesigner.ru/papki