Cómo solucionar el problema de los permisos de Symfony2

Cuando empiezas a desarrollar una aplicación Symfony2 e incluso cuando quieres probar Symfony2 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 ".../app/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 ".../app/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 app/cache/ y app/logs/ de Symfony2.

¿Por qué se produce este problema?

Symfony2 solamente escribe en dos directorios de la aplicación: app/cache/ y app/logs/. Todos los demás directorios son de sólo lectura para Symfony2. 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) Symfony2 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/Symfony2/app_dev.php) Symfony2 se ejecuta con el usuario del servidor web.

Como estos dos usuarios normalmente son diferentes, se produce un problema cuando "el Symfony2 de la consola" quiere tocar cosas que ha hecho "el Symfony2 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 Symfony2 (por ejemplo D:\Proyectos\Symfony2).
  2. Entra en el directorio app/
  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 Symfony2 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 Symfony2 (por ejemplo /Proyectos/Symfony2/).
  2. Borra todo el contenido que exista dentro de los directorios app/cache/ y app/logs/:

    $ rm -fr app/cache/*
     $ rm -fr app/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 Symfony2. 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" app/cache app/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" app/cache app/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 app/cache app/logs
$ sudo setfacl -dR -m u:www-data:rwx -m u:`whoami`:rwx app/cache app/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 Symfony2 (por ejemplo /Proyectos/Symfony2/).
  2. Borra todo el contenido que exista dentro de los directorios app/cache/ y app/logs/:

    $ rm -fr app/cache/*
     $ rm -fr app/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 Symfony2. 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" app/cache app/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" app/cache app/logs

Si después de hacer lo anterior Symfony2 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 app/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 plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más

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