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
- Accede al directorio donde tienes instalado Symfony2 (por ejemplo
D:\Proyectos\Symfony2
). - Entra en el directorio
app/
- Borra todo el contenido que exista dentro de los directorios
cache/
ylogs/
(pero no borres esos directorios). - 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.
- 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
-
Accede con la consola al directorio de tu proyecto Symfony2 (por ejemplo
/Proyectos/Symfony2/
). -
Borra todo el contenido que exista dentro de los directorios
app/cache/
yapp/logs/
:$ rm -fr app/cache/* $ rm -fr app/logs/*
-
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ónhttpd.conf
o si lo prefieres, ejecuta el siguiente comando:ps -auxf | grep httpd
-
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.
-
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
-
Accede con la consola al directorio de tu proyecto Symfony2 (por ejemplo
/Proyectos/Symfony2/
). -
Borra todo el contenido que exista dentro de los directorios
app/cache/
yapp/logs/
:$ rm -fr app/cache/* $ rm -fr app/logs/*
-
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ónhttpd.conf
o si lo prefieres, ejecuta el Monitor de Actividad y busca los procesos llamadoshttpd
. -
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
-
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:
- Abre en un editor de textos el archivo
app/console
-
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);
- Repite los mismos pasos para estos otros dos archivos:
web/app.php
yweb/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.
¿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.