W3docs

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ámetroDescripción
$filenameRuta al archivo o directorio cuyos permisos deseas cambiar.
$permissionsEl 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ígitoSe 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:

ValorPermiso
4Lectura
2Escritura
1Ejecución
0Ninguno

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).

Advertencia

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

ModoPropietarioGrupoOtrosUso típico
0644lectura/escrituralecturalecturaArchivos regulares (HTML, imágenes, configuración que lee el servidor)
0600lectura/escrituraArchivos privados (credenciales, claves)
0755lectura/escritura/ejecuciónlectura/ejecuciónlectura/ejecuciónDirectorios y scripts ejecutables
0700lectura/escritura/ejecuciónDirectorios privados
0777todotodotodoRaramente 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 only

Comprueba 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 devuelve false.
  • umask no afecta a chmod(). A diferencia de mkdir() y la creación de archivos, chmod() establece exactamente el modo que le indicas. La umask solo 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.

Práctica

Práctica
¿Qué hace la función chmod en PHP?
¿Qué hace la función chmod en PHP?
Was this page helpful?