chmod()
chmod() es una función PHP para cambiar el modo de un archivo. El modo determina quién puede acceder al archivo y qué permisos tiene.
Comprendiendo la función chmod() de PHP
chmod() cambia el modo (los bits de permiso) de un archivo o directorio en un sistema de archivos tipo Unix. El modo controla quién puede hacer qué con el archivo: leer su contenido, escribir en él o ejecutarlo. Establecer los permisos correctamente es importante para la seguridad: demasiado permisivos y cualquiera puede leer o sobreescribir datos sensibles; demasiado restrictivos y el servidor web no puede leer los archivos que necesita servir.
Esta página cubre la sintaxis, cómo leer y escribir el modo octal, los valores de permiso más comunes que realmente usarás, el valor de retorno y los errores frecuentes (el cero inicial, umask y Windows).
Sintaxis
chmod(string $filename, int $permissions): bool| Parámetro | Descripción |
|---|---|
$filename | Ruta al archivo o directorio cuyos permisos deseas cambiar. |
$permissions | El nuevo modo, como un entero octal (por ejemplo 0644). |
Devuelve true en caso de éxito y false en caso de error.
Cómo funciona el modo octal
El modo es un número octal de tres dígitos. Cada dígito describe una clase de usuario:
| Posición del dígito | Se aplica a |
|---|---|
| 1.° (ej. 644) | Propietario del archivo |
| 2.° (ej. 644) | Grupo |
| 3.° (ej. 644) | Otros (todos los demás) |
Cada dígito es la suma de los permisos que otorgas a esa clase:
| Valor | Permiso |
|---|---|
4 | Lectura |
2 | Escritura |
1 | Ejecución |
0 | Ninguno |
Súmalos: lectura + escritura = 4 + 2 = 6 y lectura + ejecución = 4 + 1 = 5. Así, 0750 significa propietario: lectura/escritura/ejecución (7), grupo: lectura/ejecución (5), otros: nada (0).
En PHP, el modo debe escribirse con un 0 inicial para que se interprete como octal. chmod("file.txt", 644) pasa el número decimal 644, que es el valor octal 1204 — casi con certeza no es lo que quieres. Escribe siempre 0644.
Valores de permiso comunes
| Modo | Propietario | Grupo | Otros | Uso típico |
|---|---|---|---|---|
0644 | lectura/escritura | lectura | lectura | Archivos regulares (HTML, imágenes, configuración que lee el servidor) |
0600 | lectura/escritura | – | – | Archivos privados (credenciales, claves) |
0755 | lectura/escritura/ejecución | lectura/ejecución | lectura/ejecución | Directorios y scripts ejecutables |
0700 | lectura/escritura/ejecución | – | – | Directorios privados |
0777 | todo | todo | todo | Raramente es buena idea — cualquiera puede leer y sobreescribir |
Ejemplos
Establecer permisos en un solo archivo
El modo 0644 permite al propietario leer y escribir, mientras que el grupo y los demás solo pueden leer:
<?php
if (chmod("example.txt", 0644)) {
echo "Permissions updated.";
} else {
echo "Failed to change permissions.";
}Hacer un script ejecutable
Para ejecutar un script PHP directamente (p. ej., un trabajo cron de CLI), el propietario necesita permiso de ejecución:
<?php
chmod("backup.php", 0744); // owner: rwx, group & others: read onlyComprueba siempre el valor de retorno
chmod() falla silenciosamente devolviendo false, por ejemplo cuando el script no es el propietario del archivo. No asumas que funcionó:
<?php
$file = "config.ini";
if (!chmod($file, 0600)) {
error_log("Could not secure {$file}");
}Errores frecuentes
- La propiedad importa. Un proceso solo puede usar
chmod()en un archivo que le pertenezca (o como superusuario). En hosting compartido, el usuario del servidor web a menudo no es el propietario, por lo que la llamada devuelvefalse. umaskno afecta achmod(). A diferencia demkdir()y la creación de archivos,chmod()establece exactamente el modo que le indicas. Laumasksolo aplica máscara a los archivos recién creados — consulta umask().- Windows ignora la mayoría de los bits. NTFS no tiene modelo de permisos Unix, así que en Windows solo el bit de solo lectura se ve significativamente afectado.
- Comprueba antes de cambiar. Usa is_writable() para probar el acceso y fileperms() para leer el modo actual antes de sobreescribirlo.
Funciones relacionadas
- fileperms() — lee los bits de permiso actuales de un archivo.
- is_writable() — comprueba si el script puede escribir en una ruta.
- umask() — establece la máscara predeterminada aplicada a los archivos recién creados.
- mkdir() — crea un directorio con un modo determinado.
Conclusión
chmod() es tu herramienta para restringir o ampliar el acceso a archivos y directorios desde PHP. Recuerda las tres reglas que evitan la mayoría de los errores: escribe el modo en octal con un cero inicial, elige el mínimo permiso que aún funcione (0644 para archivos, 0755 para directorios) y comprueba el valor de retorno porque la función falla silenciosamente cuando tu script no es el propietario del destino.