Cómo solucionar el problema de los permisos de Symfony

Cuando empiezas a desarrollar una aplicación Symfony e incluso cuando quieres probar Symfony justo después de haberlo instalado, es común encontrarse con el siguiente mensaje de error relacionado con la cache:

Whoops, looks like something went wrong.
 
RuntimeException: Could not create cache directory ".../var/cache/dev/annotations"
...

También es común este otro error relacionado con los archivos de log:

Whoops, looks like something went wrong.
 
UnexpectedValueException: The stream or file ".../var/logs/dev.log"
could not be opened: failed to open stream: Permission denied

En ambos casos el problema está relacionado con los permisos de los directorios var/cache/ y var/logs/ de Symfony.

¿Por qué se produce este problema?

Symfony solamente escribe en dos directorios de la aplicación: var/cache/ y var/logs/. Todos los demás directorios son de sólo lectura para Symfony. El problema es que no siempre escribe el mismo usuario en esos dos directorios.

Cuando ejecutas un comando en la consola (por ejemplo php app/console cache:clear para borrar la cache) Symfony se ejecuta con tu usuario de la consola. Cuando accedes a una página de tu aplicación con el navegador (por ejemplo http://localhost/Symfony/app_dev.php) Symfony se ejecuta con el usuario del servidor web.

Como estos dos usuarios normalmente son diferentes, se produce un problema cuando "el Symfony de la consola" quiere tocar cosas que ha hecho "el Symfony del navegador". Sigue leyendo para saber cómo solucionar este problema.

Cómo solucionar este problema en Windows

  1. Accede al directorio donde tienes instalado Symfony (por ejemplo D:\Proyectos\Symfony).
  2. Entra en el directorio var/
  3. Borra todo el contenido que exista dentro de los directorios cache/ y logs/ (pero no borres esos directorios).
  4. Cambia los permisos del directorio cache/:
    • Pincha el botón derecho del ratón sobre la carpeta y selecciona la opción Propiedades.
    • Pincha en la pestaña Seguridad y en la caja superior selecciona la opción que representa a Todos los usuarios.
    • En la caja inferior, otorga el permiso Control total a todos los usuarios.
    • Guarda los cambios pulsando el botón Aceptar hasta cerrar esa ventana.
  5. Repite para la carpeta logs/ los mismos pasos explicados en el punto 4 anterior.

Si después de hacer lo anterior Symfony sigue mostrando el mismo error, baja hasta la sección "Si todo lo demás falla" de este mismo artículo.

Cómo solucionar este problema en Linux

  1. Accede con la consola al directorio de tu proyecto Symfony (por ejemplo /Proyectos/Symfony/).

  2. Borra todo el contenido que exista dentro de los directorios var/cache/ y var/logs/:

    $ rm -fr var/cache/*
     $ rm -fr var/logs/*
  3. Averigua cuál es el usuario con el que se ejecuta tu servidor web. Si utilizas Apache, busca el valor de la directiva User en el archivo de configuración httpd.conf o si lo prefieres, ejecuta el siguiente comando: ps -auxf | grep httpd

  4. Ejecuta el siguiente comando para cambiar los permisos que tiene el servidor web sobre los dos directorios de escritura de Symfony. Antes de ejecutar el comando, cambia www-data por el nombre del usuario con el que se ejecuta tu servidor web:

    $ sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" var/cache var/logs

    Si no te funciona el comando anterior, sáltate el siguiente punto y sigue leyendo.

  5. Ejecuta el siguiente comando para cambiar también los permisos que sobre los mismos directorios tiene el usuario con el que se ejecutan los comandos de consola de Symfony:

    $ sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" var/cache var/logs

Si en tu sistema el comando chmod no soporta la opción +a, prueba con los siguientes comandos alternativos (cambiando de nuevo www-data por el nombre del usuario con el que se ejecuta tu servidor web):

$ sudo setfacl -R -m u:www-data:rwx -m u:`whoami`:rwx var/cache var/logs
$ sudo setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwx var/cache var/logs

Si tu sistema tampoco soporta el comando setfacl, baja hasta la sección "Si todo lo demás falla" de este mismo artículo.

Cómo solucionar este problema en Mac OS X

  1. Accede con la consola al directorio de tu proyecto Symfony (por ejemplo /Proyectos/Symfony/).

  2. Borra todo el contenido que exista dentro de los directorios var/cache/ y var/logs/:

    $ rm -fr var/cache/*
     $ rm -fr var/logs/*
  3. Averigua cuál es el usuario con el que se ejecuta tu servidor web. Si utilizas Apache, busca el valor de la directiva User en el archivo de configuración httpd.conf o si lo prefieres, ejecuta el Monitor de Actividad y busca los procesos llamados httpd.

  4. Ejecuta el siguiente comando para cambiar los permisos que tiene el servidor web sobre los dos directorios de escritura de Symfony. Antes de ejecutar el comando, cambia www-data por el nombre del usuario con el que se ejecuta tu servidor web:

    $ sudo chmod +a "www-data allow delete,write,append,file_inherit,directory_inherit" var/cache var/logs
  5. Ejecuta el siguiente comando para cambiar también los permisos que sobre los mismos directorios tiene el usuario con el que se ejecutan los comandos de consola de Symfony:

    $ sudo chmod +a "`whoami` allow delete,write,append,file_inherit,directory_inherit" var/cache var/logs

Si después de hacer lo anterior Symfony sigue mostrando el mismo error, lee la siguiente sección "Si todo lo demás falla".

Si todo lo demás falla

Si después de probar todo lo anterior el error se sigue produciendo, existe una solución alternativa que funciona siempre. ¿Por qué hemos esperado hasta este momento para contártela? Porque es una solución extrema que sólo hay que utilizar cuando las soluciones más profesionales no funcionan:

  1. Abre en un editor de textos el archivo bin/console
  2. Descomenta la línea que contiene una llamada a la función umask():

    // if you don't want to setup permissions the proper way,
     // just uncomment the following PHP line and read
     // http://symfony.com/doc/current/book/installation.html#configuration-and-setup
     // for more information
     umask(0000);
  3. Repite los mismos pasos para estos otros dos archivos: web/app.php y web/app_dev.php

¿Qué efecto tiene este cambio? A partir de ahora, los archivos que generen los comandos de consola y el servidor web tendrán los permisos 777, por lo que cualquier usuario puede leerlos, escribirlos y ejecutarlos.

Si asignar esos permisos te parece arriesgado, puedes utilizar el permiso 755 cambiando umask(0000) por umask(0022) en los tres archivos anteriores. No obstante, esto sólo funciona si el usuario que ejecuta los comandos y el usuario del servidor web pertenecen al mismo grupo.

Aunque esta solución sea la que se utiliza como último recurso, eso no significa que sea insegura. Los propios creadores del framework la recomiendan cuando todo lo demás falla.

Compartir en

¿Has visto algún error?

Avísanos en [email protected] para que podamos corregirlo. Gracias.

Proyectos Symfony destacados

La forma más sencilla de generar el backend de tus aplicaciones Symfony. Ver más

Síguenos en @symfony_es para acceder a las últimas noticias.