Sto cercando di creare una directory sul mio server con PHP con il comando:Perché PHP non può creare una directory con 777 autorizzazioni?
mkdir("test", 0777);
Ma non dà autorizzazioni complete, solo questi:
rwxr-xr-x
Sto cercando di creare una directory sul mio server con PHP con il comando:Perché PHP non può creare una directory con 777 autorizzazioni?
mkdir("test", 0777);
Ma non dà autorizzazioni complete, solo questi:
rwxr-xr-x
La modalità viene modificata da il tuo attuale umask
, che in questo caso è 022
.
Il modo in cui lo umask
funziona è sottrattivo. Si prende il permesso iniziale dato al mkdir
e sottrarre il umask
per ottenere il permesso reale:
0777
- 0022
======
0755 = rwxr-xr-x.
Se non si vuole che questo accada, è necessario impostare la vostra umask
temporaneamente a zero quindi non ha effetto. È possibile farlo con il seguente frammento:
$oldmask = umask(0);
mkdir("test", 0777);
umask($oldmask);
La prima riga cambia il umask
a zero durante la memorizzazione della precedente in $oldmask
. La seconda riga rende la directory utilizzando le autorizzazioni desiderate e (ora irrilevante) umask
. La terza riga ripristina lo umask
in quello che era in origine.
Vedere il documento PHP per umask e mkdir per ulteriori dettagli.
Probabilmente, la vostra umask è impostato per escludere coloro
La creazione di file e directory è influenzato dall'impostazione di umask. È possibile creare file con un particolare insieme di permessi manipolando umask come segue: -
$old = umask(0);
mkdir("test", 0777);
umask($old);
Per coloro che hanno cercato
mkdir('path', 777);
e non ha funzionato.
È perché, apparentemente, lo 0 che precede la modalità file è molto importante e indica a chmod di interpretare il numero passato come ottale anziché decimale.
Ps. Questa non è una soluzione alla domanda, ma solo un add-on per l'anwser accettato
Evitare l'uso di questa funzione nei server Web con multithreading. È meglio cambiare i permessi dei file con chmod() dopo aver creato il file.
Esempio:
$dir = "test";
$permit = 0777;
mkdir($dir);
chmod($dir, $permit);