Problemas con PHP, umask, mkdir y permisos
Supongamos que se tiene la siguiente situación:
Una aplicación Web provee al usuario la funcionalidad de subir archivos. Los archivos son guardados en disco utilizando el siguiente formato /uploads/user_<ID> donde ID es un identificador de usuario.
Desactivar safe_mode
Puede ser que la opción safe_mode de PHP esté previniendo el acceso a la carpeta, ya que puede pasar que el usuario que accede sea distinto al que lo crea.
La solución podría estar en deshabilitar safe_mode. Para esto hay que modificar el archivo php.ini y poner la entrada safe_mode=Off.
Si usas Plesk, puedes probar deshabilitar safe mode desde el panel de control de Plesk.
Usar umask
Otra razón del problema puede estar en que el usuario que crea la carpeta, tenga configurado umask con algún valor distinto de cero. Esto hace que al usar funciones como mkdir, se aplique la máscara para asignar los privilegios de lectura, escritura o ejecución.
Ejemplo, si el usuario que crea el directorio tiene por defecto un umask de 022 entonces por más que uses mkdir($upload_path, 0777), se creará una carpeta con permisos 755 en lugar de 777.
En PHP es fácil sobre-escribir provisoriamente el umask. Lo recomendable es que luego de sobreescribirlo y crear la carpeta, vuelvas a dejarlo como estaba. Esto se puede hacer de la siguiente manera:
$oldumask = umask(0);
mkdir($upload_path, 0777);
$result4 = umask($oldumask);
Artículos relacionados:
- Deshabilitar safe_mode en Plesk
En la versión 8 de Plesk, es posible deshabilitar safe_mode... - La solución a los problemas de tildes y caracteres especiales con PHP y SQL Server
Si estás teniendo problemas con el charset, encoding type, etc.... - SQLServer 2000 problemas con TCP/IP
connection refused, error establishing socket, … mensajes que parecen ser... - Archivos Temporales de Internet Explorer en XP
Un problema común para quienes utilizan navegadores de Internet y...
Bastaría con:
$oldumask = umask(0);
mkdir($upload_path, 0777);
umask($oldumask);
No tienes porque asignarle una variable.
Sí, tienes razón. No hay por qué asignarle la variable $result al final (quedó del código que justo estaba picando al momento de probar el “snippet”). =)
Saludos
De todas formas muchas gracias