Sto cercando di creare una directory con la funzione mkdir PHP, ma ottengo un errore come segue: Warning: mkdir() [function.mkdir]: Permission denied in .... Come risolvere il problema?
Sto cercando di creare una directory con la funzione mkdir PHP, ma ottengo un errore come segue: Warning: mkdir() [function.mkdir]: Permission denied in .... Come risolvere il problema?
Risposte:
So che questo è un vecchio thread, ma ha bisogno di una risposta migliore. Non dovresti aver bisogno di impostare i permessi su 777, questo è un problema di sicurezza in quanto dà accesso in lettura e scrittura al mondo. È possibile che il tuo utente apache non disponga dei permessi di lettura / scrittura sulla directory.
Ecco cosa fai in Ubuntu
Assicurati che tutti i file siano di proprietà del gruppo e dell'utente Apache. In Ubuntu è il gruppo e l'utente www-data
chown -R www-data:www-data /path/to/webserver/www
Successivamente ha consentito a tutti i membri del gruppo www-data di leggere e scrivere file
chmod -R g+rw /path/to/webserver/www
La mkdir()funzione php ora dovrebbe funzionare senza restituire errori
/opt/lampp/htdocs/www/my-app/public/uploads.. Fondamentalmente quello che sto cercando di fare è che ogni utente loggato carichi i file all'interno della cartella dei caricamenti e crei anche cartelle di album (questo sarà fatto con php) per archiviare le foto ..
Risposta tardiva per le persone che lo troveranno tramite Google in futuro. Mi sono imbattuto nello stesso problema.
NOTA: SONO SU MAC OSX LION
Quello che succede è che apache viene eseguito come utente "_www" e non dispone delle autorizzazioni per modificare alcun file. Noterai che NESSUNA funzione del filesystem funziona tramite php.
Come risolvere:
Apri una finestra del Finder e dalla barra dei menu, scegli Vai> Vai alla cartella> / private / etc / apache2
ora apri httpd.conf
trova:
User _www
Group _www
cambia il nome utente:
User <YOUR LOGIN USERNAME>
Ora riavvia Apache eseguendo questo terminale del modulo:
sudo apachectl -k restart
Se ancora non funziona, mi capita di fare quanto segue prima di fare quanto sopra. Potrebbe essere correlato.
Apri il terminale ed esegui i seguenti comandi: (nota, i file del mio server web si trovano in / Library / WebServer / www. Cambia in base alla posizione del tuo sito web)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_wwwe creare un gruppo per te e Apache. Crea un nuovo gruppo, diciamo chiamato trusted, e mettici _wwwdentro. Quindi rendi attendibile il proprietario del gruppo di tutti i file nella directory dei documenti del server. Infine, fai chmod g+rwxquanto necessario solo sui file a cui Apache deve accedere, in modo che il trustedgruppo abbia il permesso di modificare i file.
Le risposte solo link non sono considerate buone pratiche su StackOverflow, ma il consiglio fornito qui NON dovrebbe generalmente essere seguito.
Vorrei tornare a questa ottima risposta su una domanda simile . Quoto:
Per favore smettila di suggerire di usare 777. Stai rendendo il tuo file scrivibile da tutti, il che significa praticamente perdere tutta la sicurezza per cui è stato progettato il sistema di autorizzazione. Se lo suggerisci, pensa alle conseguenze che potrebbe avere su un server web mal configurato: diventerebbe incredibilmente facile "hackerare" il sito, sovrascrivendo i file. Quindi non farlo.
Fissare le autorizzazioni della directory si tenta di creare una directory in .
So che questo thread è vecchio, ma forse questo aiuterà qualcuno, un giorno.
Il problema per cui PHP dice "Permission denied" per mkdir () - percorso URL errato. Quindi, per risolverlo, tutto ciò che serve è ottenere il percorso corretto. L'ho fatto in questo modo:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
È necessario disporre dell'autorizzazione del file system per creare la directory.
Esempio: in Ubuntu 10.04 apache (php) viene eseguito come utente: www-data nel gruppo: www-data
Significa che l'utente www-data deve accedere per creare la directory.
Puoi provare tu stesso usando: 'su www-data' per diventare l'utente www-data.
Come soluzione rapida, puoi fare: sudo chmod 777 my_parent_dir
chmod 0777darà accesso in lettura e scrittura al mondo! Non dovresti consigliare qualcosa del genere. Tuttavia, il consiglio con il gruppo di utenti è attualmente il migliore qui :)
L'altra cosa che puoi fare è andare su: / etc / sudoers
Aggiungere la seguente riga che dà il permesso a quell'utente www-data ALL = (ALL: ALL) ALL Perché www-data? questo perché apache è in esecuzione con questo nome utente.
Nel caso in cui il tuo utente sia diverso, prova username ALL = (ALL: ALL) ALL
Questo ha funzionato per me.
sudoersdirettamente, ma accedi come root e usa il visudocomando te : che controlla eventuali modifiche per evitare modifiche errate, che possono causare errori di analisi quando il file sudoers viene caricato, il che potrebbe lasciarti impotente (come in nessun diritto di cambiare qualcosa)
Ho questo problema solo ora, la mia migliore soluzione che posso darti in questo momento (nonostante tu non abbia incluso nessuno dei tuoi codici) sarebbe:
Se stavi usando un comando ricorsivo per creare sottocartelle, non dimenticare di mettere 0755 (ricordati di includere 0 all'inizio) nel comando mkdir, ad esempio:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}Questo ha funzionato anche per me in questo momento.
Se stai usando LINUX, per prima cosa controlliamo l'utente di apache, poiché in alcune distribuzioni può essere diverso:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
Diciamo che il risultato è "http". Fai il seguente, ricorda solo di cambiare path_to_folder in folder path:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
controlla se non è un problema con umask
if (!function_exists('mkdir_r')) {
/**
* create directory recursively
* @param $dirName
* @param int $rights
* @param string $dir_separator
* @return bool
*/
function mkdir_r($dirName, $rights = 0744, $dir_separator = DIRECTORY_SEPARATOR) {
$dirs = explode($dir_separator, $dirName);
$dir = '';
$created = false;
foreach ($dirs as $part) {
$dir .= $part . $dir_separator;
if (!is_dir($dir) && strlen($dir) > 0) {
$created = mkdir($dir, $rights);
}
}
return $created;
}
}
if (!function_exists('ensure_dir')) {
/**
* ensure directory exist if not create
* @param $dir_path
* @param int $mode
* @param bool $use_mask
* @param int $mask
* @return bool
*/
function ensure_dir($dir_path, $mode = 0744, $use_mask = true, $mask = 0002) {
// set mask
$old_mask = $use_mask && $mask != null
? umask($mask)
: null;
try {
return is_dir($dir_path) || mkdir_r($dir_path, $mode);
} finally {
if ($use_mask && $old_mask != null) {
// restore original
umask($old_mask);
}
}
}
}
Dopo aver installato il server ftp con sudo apt-get install vsftpdsarà necessario configurarlo. Per abilitare l'accesso in scrittura è necessario modificare il /etc/vsftpd.conffile e rimuovere il commento dal file
#write_enable=YES
riga, quindi dovrebbe leggere
write_enable=YES
Salvare il file e riavviare vsftpdcon sudo service vsftpd restart.
Per altre opzioni di configurazione consultare questa documentazione oman vsftpd.conf
Questo errore si verifica se stai utilizzando il percorso sbagliato.
Ad esempio:
Sto usando il sistema Ubuntu e il nome della cartella del mio progetto è "myproject"
Supponiamo che esista la directory myproject / public / report e di voler creare una nuova cartella chiamata orders
Allora ho bisogno di un intero percorso in cui esiste il mio progetto. È possibile ottenere il percorso tramite il comando PWD
Quindi il mio percorso di root sarà = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / mioprogetto / public / report / Orders';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
Funzionerà per te !! Godere !!