Avant de rentrer dans le cœur du problème, je tiens à prévenir nos lecteurs adorés que ce court billet est exclusivement destiné à nos confrères développeurs Symfony. C’est donc normal si vous ne comprenez pas grand chose à ce que je raconte. Ne vous en faites pas, on ne vous oubli pas pour autant, il y’a pleins de supers articles en cours de rédaction qui seront bientôt prêts pour satisfaire votre faim intarissable de savoir.

Pour vous faire patienter notre prochain article voici une armée de chiots tromignons

Le problème

Le message d’erreur qui térrorise les développeurs Symfony depuis 2011

Si, comme nous, vous développez des applications Symfony2 (ou 3) en local sur un système Ubuntu / linux vous avez forcément déjà rencontré au moins une fois dans votre existence l’une des exceptions suivantes :

  • Cache directory « /var/www/html/***/app/cache » is not writable.
  • The stream or file « /var/www/html/***/app/logs » could not be opened: failed to open stream: Permission denied

Ou sur Symfony3 :

  • Cache directory « /var/www/html/***/var/cache » is not writable.
  • The stream or file « /var/www/html/***/var/logs » could not be opened: failed to open stream: Permission denied

Je sais pas pour vous, mais moi j’en ai eu assez rapidement marre de modifier 10 fois par jour les permissions du dossier app (ou var) de mon application avec un bon vieux CHMOD. C’est pour cela que j’ai fouillé un peu sur l’outil internet pour trouver une solution de flemmard (oui le développeur est un être flemmard…). Et je me suis dis que je pourrais partager avec vous les résultats de ma recherche.

La solution

Pour corriger ce problème de manière définitive, il faut utiliser les droits d’accès (ACL) de linux. On doit d’abord récupérer l’utilisateur correspondant à votre webserver (apache) avec la première commande puis inscrire cet utilisateur dans la liste des utilisateurs disposant des droits en lecture, écriture et exécution sur nos dossiers logs et cache Symfony avec les deux autres commandes. (Vérifiez bien d’être à la racine de votre projet Symfony, sait on jamais…)
HTTPDUSER=`ps aux | grep -E '[a]pache|[h]ttpd|[_]www|[w]ww-data|[n]ginx' | grep -v root | head -1 | cut -d -f1`
sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX var/cache var/logs
sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX var/cache var/logs

Si par malheur votre application tourne toujours sur Symfony2, il faudrait penser à l’upgrader mais sinon il suffit de modifier les 2 dernières commandes comme cela :

sudo setfacl -R -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs
sudo setfacl -dR -m u:"$HTTPDUSER":rwX -m u:`whoami`:rwX app/cache app/logs

Si vous tombez sur le message d’erreur : « setfacl : commande introuvable », faites un petit apt-get install :

sudo apt-get install acl
Source : Documentation Symfony

Un article rédigé pour vous par Julien

Développeur web. "Développeur aguerri, il surprend par son aptitude à gérer un projet. Réactif et efficace, il est le partenaire indispensable pour mener votre projet à son terme et dans les délais." Spécialités : le design et l'ergonomie avec spé bûcheron | Râleur de niveau 100 (certification Sauvé obtenue en 2016). Il aime : les interfaces simples et épurées avec du rose et du vert en couleurs principales | Safari | l'Aïoli | téléphoner aux clients | J.R Smith | les :first-child et autres :nth-child. Il aime pas : les lignes de code, il y est allergique | les Dallas Mavericks.