Estoy tratando de crear un directorio con la función mkdir PHP, pero me da un error de la siguiente manera: Warning: mkdir() [function.mkdir]: Permission denied in .... ¿Cómo solucionar el problema?
Estoy tratando de crear un directorio con la función mkdir PHP, pero me da un error de la siguiente manera: Warning: mkdir() [function.mkdir]: Permission denied in .... ¿Cómo solucionar el problema?
Respuestas:
Sé que este es un hilo antiguo, pero necesita una mejor respuesta. No debería necesitar establecer los permisos en 777, ese es un problema de seguridad ya que brinda acceso de lectura y escritura al mundo. Puede ser que su usuario de apache no tenga permisos de lectura / escritura en el directorio.
Esto es lo que haces en Ubuntu
Asegúrese de que todos los archivos sean propiedad del grupo y del usuario de Apache. En Ubuntu es el grupo de datos www y el usuario
chown -R www-data:www-data /path/to/webserver/www
Luego habilitó a todos los miembros del grupo www-data para leer y escribir archivos
chmod -R g+rw /path/to/webserver/www
La mkdir()función php ahora debería funcionar sin devolver errores
/opt/lampp/htdocs/www/my-app/public/uploads... Básicamente, lo que estoy tratando de hacer es que cada usuario que haya iniciado sesión cargue archivos dentro de la carpeta de cargas y también cree carpetas de álbumes (esto se hará con php) para almacenar fotos ..
Respuesta tardía para las personas que encuentren esto a través de Google en el futuro. Tuve el mismo problema.
NOTA: ESTOY EN MAC OSX LION
Lo que sucede es que apache se está ejecutando como el usuario "_www" y no tiene permisos para editar ningún archivo. Notarás que NO hay funciones del sistema de archivos que funcionen a través de php.
Como arreglar:
Abra una ventana del buscador y en la barra de menú, elija Ir> Ir a carpeta> / private / etc / apache2
ahora abre httpd.conf
encontrar:
User _www
Group _www
cambiar el nombre de usuario:
User <YOUR LOGIN USERNAME>
Ahora reinicie Apache ejecutando este formulario de terminal:
sudo apachectl -k restart
Si aún no funciona, hago lo siguiente antes de hacer lo anterior. Podría estar relacionado.
Abra el terminal y ejecute los siguientes comandos: (tenga en cuenta que los archivos de mi servidor web se encuentran en / Library / WebServer / www. Cambie según la ubicación de su sitio web)
sudo chmod 775 /Library/WebServer/www
sudo chmod 775 /Library/WebServer/www/*
_wwwy crear un grupo para usted y Apache. Haga un nuevo grupo, diga llamado trusted, y colóquese _wwwen él. Luego, confíe en el propietario del grupo de todos los archivos en el directorio de documentos de su servidor. Finalmente, haga lo chmod g+rwxque sea necesario solo en los archivos a los que Apache necesita acceder, de modo que el trustedgrupo tenga permiso para editar los archivos.
Las respuestas de solo enlace no se consideran una buena práctica en StackOverflow, pero los consejos que se dan aquí generalmente NO deben seguirse.
Me gustaría volver a esta gran respuesta sobre una pregunta similar . Yo cito:
Deje de sugerir el uso de 777. Está haciendo que todos puedan escribir en su archivo, lo que significa que perderá toda la seguridad para la que fue diseñado el sistema de permisos. Si sugiere esto, piense en las consecuencias que puede tener en un servidor web mal configurado: sería increíblemente fácil "piratear" el sitio web sobrescribiendo los archivos. Entonces, no lo hagas.
Fijar los permisos del directorio intenta crear un directorio en .
Sé que este hilo es antiguo, pero quizás esto ayude a alguien, algún día.
El problema por el que PHP dice "Permiso denegado" para mkdir () - ruta URL incorrecta. Entonces, para solucionarlo, todo lo que necesita es obtener la ruta correcta. Lo hice de esta manera:
<?php
$root = $_SERVER["DOCUMENT_ROOT"];
$dir = $root . '/somefolder/';
if( !file_exists($dir) ) {
mkdir($dir, 0755, true);
}
?>
Debe tener permiso del sistema de archivos para crear el directorio.
Ejemplo: en Ubuntu 10.04 apache (php) se ejecuta como usuario: www-data en el grupo: www-data
Lo que significa que el usuario www-data necesita acceso para crear el directorio.
Puede intentarlo usted mismo utilizando: 'su www-data' para convertirse en el usuario de www-data.
Como solución rápida, puede hacer: sudo chmod 777 my_parent_dir
chmod 0777le dará acceso de lectura y escritura al mundo! No deberías aconsejar algo así. Sin embargo, el consejo con el grupo de usuarios es actualmente el mejor aquí :)
La otra cosa que puede hacer es ir a: / etc / sudoers
Añada la siguiente línea que le da permiso a ese usuario www-data ALL = (ALL: ALL) ALL ¿Por qué www-data? esto se debe a que apache se ejecuta con este nombre de usuario.
En caso de que su usuario sea diferente, pruebe el nombre de usuario TODOS = (TODOS: TODOS) TODOS
Esto funcionó para mí.
sudoersdirectamente, inicie sesión como root y use el visudocomando te : que verifica cualquier cambio para evitar ediciones defectuosas, que pueden causar errores de análisis cuando se carga el archivo sudoers, lo que puede dejarlo impotente (como en cambiar algo)
Tengo este problema en este momento, mi mejor solución que puedo darte ahora mismo (a pesar de que no incluiste ninguno de tu código) sería:
Si estaba utilizando un comando recursivo para crear subcarpetas, no olvide poner 0755 (recuerde incluir 0 al principio) en el comando mkdir, por ejemplo:
if(!file_exists($output)){
if (!mkdir($output, 0755, true)) {//0755
die('Failed to create folders...');
}
}Esto también me funcionó en este momento.
Si está usando LINUX, primero verifiquemos al usuario de apache, ya que en algunas distribuciones puede ser diferente:
egrep -i '^user|^group' /etc/httpd/conf/httpd.conf
Digamos que el resultado es "http". Haga lo siguiente, solo recuerde cambiar path_to_folder a la ruta de las carpetas:
chown -R http:http path_to_folder
chmod -R g+rw path_to_folder
compruebe si no es 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);
}
}
}
}
Después de instalar el servidor ftp sudo apt-get install vsftpd, tendrá que configurarlo. Para habilitar el acceso de escritura, debe editar el /etc/vsftpd.confarchivo y descomentar el
#write_enable=YES
línea, por lo que debería leer
write_enable=YES
Guarde el archivo y reinicie vsftpdcon sudo service vsftpd restart.
Para otras opciones de configuración, consulte esta documentación oman vsftpd.conf
Este error ocurre si está utilizando la ruta incorrecta.
Por ejemplo:
Estoy usando el sistema ubuntu y el nombre de la carpeta de mi proyecto es 'myproject'
Supongamos que tengo el directorio myproject / public / report y quiero crear una nueva carpeta llamada orders
Entonces necesito un camino completo donde existe mi proyecto. Puede obtener la ruta mediante el comando PWD
Entonces mi ruta raíz será = '/ home / htdocs / myproject /'
$ dir = '/ home / htdocs / myproject / public / report / Orders';
if (!is_dir($dir)) {
mkdir($dir, 0775, true);
}
¡Funcionará para ti! Disfruta !!