estoy tratando de crear un directorio en mi servidor usando PHP con el comando:¿Por qué PHP no puede crear un directorio con 777 permisos?
mkdir("test", 0777);
Pero no da permisos completos, sólo éstos:
rwxr-xr-x
estoy tratando de crear un directorio en mi servidor usando PHP con el comando:¿Por qué PHP no puede crear un directorio con 777 permisos?
mkdir("test", 0777);
Pero no da permisos completos, sólo éstos:
rwxr-xr-x
El modo es modificado por su actual umask
, que es 022
en este caso.
La forma en que funciona el umask
es sustractivo. Se toma el permiso inicial dado a mkdir
y resta el umask
para obtener el permiso real :
0777
- 0022
======
0755 = rwxr-xr-x.
Si no desea que esto ocurra, es necesario establecer su umask
temporalmente a cero por lo que no tiene efecto. Usted puede hacer esto con el siguiente fragmento: cambia
$oldmask = umask(0);
mkdir("test", 0777);
umask($oldmask);
La primera línea de la umask
a cero, mientras que el almacenamiento de la anterior en $oldmask
. La segunda línea hace que el directorio use los permisos deseados y (ahora irrelevante) umask
. La tercera línea restaura el umask
a lo que era originalmente.
Consulte el PHP doco para umask y mkdir para obtener más información.
Probablemente, su umask está ajustado para excluir los
La creación de archivos y directorios se ve afectado por el ajuste de la máscara de usuario. Puede crear archivos con un determinado conjunto de permisos mediante la manipulación de umask de la siguiente manera: -
$old = umask(0);
mkdir("test", 0777);
umask($old);
Para aquellos que intentó
mkdir('path', 777);
y no funcionó.
Es porque, aparentemente, el 0 que precede al modo de archivo es muy importante, lo que le dice a chmod que interprete el número pasado como un octal en lugar de un decimal.
Sal. Esta no es una solución a la pregunta, sino solo un complemento al motor aceptado.
Evite utilizar esta función en servidores web multiproceso. Es mejor cambiar los permisos de archivo con chmod() después de crear el archivo.
Ejemplo:
$dir = "test";
$permit = 0777;
mkdir($dir);
chmod($dir, $permit);