{"id":954,"date":"2014-05-15T13:57:39","date_gmt":"2014-05-15T11:57:39","guid":{"rendered":"http:\/\/www.lafabriquedecode.com\/blog\/?p=954"},"modified":"2016-07-25T09:38:03","modified_gmt":"2016-07-25T07:38:03","slug":"symfony-2-en-finir-nettoyage-du-cache-via-cacheclear","status":"publish","type":"post","link":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/","title":{"rendered":"Symfony 2 : en finir avec le nettoyage du cache via cache:clear !"},"content":{"rendered":"<h1>Symfony, qu&rsquo;est-ce que tu nous cache ?<\/h1>\n<p>Que vous soyez un utilisateur avanc\u00e9 ou d\u00e9butant du c\u00e9l\u00e8bre <em>framework<\/em> MVC bas\u00e9 sur PHP, vous avez forc\u00e9ment t\u00f4t ou tard du affronter cet \u00e9cueil : <strong>mettre \u00e0 jour le cache fichier de Symfony<\/strong> !<\/p>\n<p>Le sc\u00e9nario est le suivant : vous installez la derni\u00e8re version de votre <em>framework<\/em> pr\u00e9f\u00e9r\u00e9, vous vous rendez sur la page Web de configuration http:\/\/monsite\/app_dev.php comme on vous l&rsquo;a dit et l\u00e0, c&rsquo;est le drame :<\/p>\n<blockquote><p>RuntimeException: Unable to create the cache directory (\/var\/www\/Symfony\/app\/cache\/dev)<\/p><\/blockquote>\n<p>Rien de choquant, j&rsquo;ai d\u00e9compress\u00e9 l&rsquo;archive en tant qu&rsquo;utilisateur <em>seb<\/em>, c&rsquo;est donc lui qui poss\u00e8de tous les droits sur l&rsquo;arborescence, que j&rsquo;ai simplifi\u00e9e dans l&rsquo;exemple pour ne garder que les r\u00e9pertoires :<\/p>\n<blockquote><p>ls -l Symfony<br \/>\ntotal 120<br \/>\ndrwxr-xr-x  6 seb seb  4096 mai   15 10:23 app<br \/>\ndrwxr-xr-x  2 seb seb  4096 mai   15 10:23 bin<br \/>\ndrwxr-xr-x  3 seb seb  4096 mai   15 10:23 src<br \/>\ndrwxr-xr-x 13 seb seb  4096 mai   15 10:23 vendor<br \/>\ndrwxr-xr-x  3 seb seb  4096 avril 27 20:36 web\n<\/p><\/blockquote>\n<p>L&rsquo;utilisateur par d\u00e9faut de mon serveur HTTP Apache est <em>www-data<\/em> : lorsque le malheureux tente de cr\u00e9er le r\u00e9pertoire de cache, il \u00e9choue lamentablement, faute de droits suffisants ! Comment faire ?<\/p>\n<h1>Bougredane et Bougredandouille ne font qu&rsquo;un, mes users aussi !<\/h1>\n<p>Et si nous mettions <em>www-data<\/em> et notre user <em>seb<\/em> dans le m\u00eame panier ? Apr\u00e8s tout, ils vont se partager l&rsquo;acc\u00e8s aux diff\u00e9rents r\u00e9pertoires, autant officialiser leur collaboration ! Nous n&rsquo;aurions plus qu&rsquo;\u00e0 donner les droits au groupe et nos deux utilisateurs pourraient enfin se partager cette arborescence dans la joie et la bonne humeur (et accessoirement, l&rsquo;efficacit\u00e9 !)<\/p>\n<p>Je vais ajouter <em>seb<\/em> \u00e0 mon groupe <em>www-data<\/em>, dont fait partie l&rsquo;utilisateur <em>www-data<\/em>. Je r\u00e9p\u00e8te : il existe un groupe <em>www-data<\/em>, dont l&rsquo;utilisateur principal est lui-m\u00eame nomm\u00e9 <em>www-data<\/em>, attention \u00e0 ne pas confondre ! Rien ne vous interdit d&rsquo;y rajouter d&rsquo;autres utilisateurs ! C&rsquo;est m\u00eame ce que nous allons faire de suite, notre utilisateur <em>seb<\/em> va rejoindre le groupe <em>www-data<\/em> :<\/p>\n<blockquote><p><strong>sudo<\/strong> usermod -aG www-data votre_utilisateur<\/p><\/blockquote>\n<p>N&rsquo;oubliez pas l&rsquo;option -a (<em>append<\/em>) ! Si vous l&rsquo;omettez, vous \u00e9crasez l&rsquo;ensemble des groupes auxquels vous appartenez avec le nouveau groupe ! Pour vous assurer que le changement a bien \u00e9t\u00e9 pris en compte, tapez la commande <strong>groups<\/strong> :<\/p>\n<blockquote><p>seb@debian:\/var\/www$ groups<br \/>\nseb www-data lpadmin<\/p><\/blockquote>\n<p>Mission (presque) accomplie : il vous faut en effet vous d\u00e9connecter\/reconnecter pour que ces changements soient pris en compte par le syst\u00e8me d&rsquo;exploitation. <\/p>\n<div id=\"attachment_957\" style=\"width: 407px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/dicentim-1.gif\"><img aria-describedby=\"caption-attachment-957\" loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/dicentim-1.gif\" alt=\"Extrait d&#039;un strip de Dicentim\" width=\"397\" height=\"170\" class=\"size-full wp-image-957\" \/><\/a><p id=\"caption-attachment-957\" class=\"wp-caption-text\">Ah, les lectures de jeunesse&#8230;<\/p><\/div>\n<h1>Changer les droits d&rsquo;acc\u00e8s \u00e0 l&rsquo;arborescence de Symfony<\/h1>\n<p>Nous avons deux utilisateurs qui font partie du m\u00eame groupe mais \u00e0 ce stade, une arborescence qui est toujours la propri\u00e9t\u00e9 de l&rsquo;utilisateur qui l&rsquo;a cr\u00e9\u00e9e. Il faut donc la changer ! Disons dans un premier temps qu&rsquo;elle appartient dor\u00e9navant au groupe <em>www-data<\/em> :<\/p>\n<blockquote><p>chgrp -R www-data Symfony\/<\/p><\/blockquote>\n<p>Puis, que tout utilisateur membre de ce groupe poss\u00e8de les droits en \u00e9criture dessus :<\/p>\n<blockquote><p>chmod -R g+w Symfony\/<\/p><\/blockquote>\n<p>Regardons l&rsquo;impact du changement :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ndrwxrwxr-x  6 seb www-data  4096 mai   15 10:23 app\r\ndrwxrwxr-x  2 seb www-data  4096 mai   15 10:23 bin\r\ndrwxrwxr-x  3 seb www-data  4096 mai   15 10:23 src\r\ndrwxrwxr-x 13 seb www-data  4096 mai   15 10:23 vendor\r\ndrwxrwxr-x  3 seb www-data  4096 avril 27 20:36 web\r\n<\/pre>\n<p>A ce stade l\u00e0, la joie nous anime et nous retournons imm\u00e9diatement sur l&rsquo;URL de notre page de config&rsquo; pour contempler avec satisfaction les cons\u00e9quences du changement : TOUT MARCHE, c&rsquo;est magnifique ! Alors nous param\u00e9trons la connexion \u00e0 notre base de donn\u00e9es ! Tout se d\u00e9roule parfaitement, nous prenons un moment pour nous extasier sur la d\u00e9mo <em>Hello World<\/em> puis tr\u00e8s vite, nous d\u00e9veloppons nos premiers contr\u00f4leurs d&rsquo;action, nos premi\u00e8res entit\u00e9s, nos premiers <em>templates<\/em> Twig&#8230;Et un beau jour, nous d\u00e9cidons de nettoyer le cache en ligne de commande avec la c\u00e9l\u00e8bre commande <strong>app\/console cache:clear &#8211; -env=dev<\/strong> (le env \u00e9tant optionnel car valant dev par d\u00e9faut). La sanction est imm\u00e9diate :<\/p>\n<blockquote><p><strong>[UnexpectedValueException]<br \/>\n  The stream or file \u00ab\u00a0\/var\/www\/Symfony\/app\/logs\/dev.log\u00a0\u00bb could not be opened: failed to open stream: Permission denied  <\/strong><\/p><\/blockquote>\n<div id=\"attachment_962\" style=\"width: 300px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/crying-man2-290x290.jpg\"><img aria-describedby=\"caption-attachment-962\" loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/crying-man2-290x290.jpg\" alt=\"Image d&#039;une personne pleurant\" width=\"290\" height=\"290\" class=\"size-full wp-image-962\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/crying-man2-290x290.jpg 290w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/crying-man2-290x290-150x150.jpg 150w\" sizes=\"(max-width: 290px) 100vw, 290px\" \/><\/a><p id=\"caption-attachment-962\" class=\"wp-caption-text\">Un d\u00e9veloppeur qui vient de faire son premier cache:clear en CLI<\/p><\/div>\n<p>Mais&#8230;attendez une seconde&#8230;je ne comprends pas, j&rsquo;ai deux utilisateurs du m\u00eame groupe maintenant, pourquoi tant de haine \u00e0 mon \u00e9gard ? Si vous regardez le fichier incrimin\u00e9 (qui se trouve dans le r\u00e9pertoire de logs et pas de cache), voici ce que vous y verrez :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n-rw-r--r-- 1 www-data www-data 94637 mai   15 11:01 dev.log\r\n-rw-r--r-- 1 www-data www-data  2626 mai   15 11:00 prod.log\r\n<\/pre>\n<p>SCANDALE ! Ce sagouin de www-data n&rsquo;est pas partageur, il n&rsquo;a pas donn\u00e9 les droits d&rsquo;\u00e9criture au groupe ! Mon utilisateur <em>seb<\/em> qui utilise la ligne de commande ne peut donc pas \u00e9crire dans ce fichier ! Que faire ? M&rsquo;accaparer de force les droits d&rsquo;\u00e9criture sur le r\u00e9pertoire logs ? Allons-y !<\/p>\n<p>Mon utilisateur <em>seb<\/em> n&rsquo;a pas cr\u00e9e ces fichiers, il doit donc passer par <strong>sudo<\/strong> pour faire cette modification :<\/p>\n<blockquote><p>sudo chmod -R g+w app\/logs\/<\/p><\/blockquote>\n<p>A la bonne heure ! Si www-data ne pr\u00eate pas, je lui arrache des mains !<br \/>\nS\u00fbr de moi je relance un <strong>app\/console cache:clear<\/strong> et je manque de m&rsquo;\u00e9trangler !<\/p>\n<blockquote><p><strong>  [RuntimeException]<br \/>\n  Unable to write in the \u00ab\u00a0\/var\/www\/Symfony\/app\/cache\/dev\u00a0\u00bb directory <\/strong><\/p><\/blockquote>\n<div id=\"attachment_964\" style=\"width: 655px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/2615737-asterix-et-perils.jpg\"><img aria-describedby=\"caption-attachment-964\" loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/2615737-asterix-et-perils.jpg\" alt=\"Bulle de b\u00e9d\u00e9 avec des pictogrammes\" width=\"645\" height=\"320\" class=\"size-full wp-image-964\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/2615737-asterix-et-perils.jpg 645w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/2615737-asterix-et-perils-300x148.jpg 300w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/2615737-asterix-et-perils-624x309.jpg 624w\" sizes=\"(max-width: 645px) 100vw, 645px\" \/><\/a><p id=\"caption-attachment-964\" class=\"wp-caption-text\">Le r\u00e9flexe primaire du d\u00e9veloppeur contrari\u00e9 : la bord\u00e9e d&rsquo;injures !<\/p><\/div>\n<p>Sans surprise, je constate les m\u00eames d\u00e9g\u00e2ts dans le r\u00e9pertoire cache :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\ndrwxr-xr-x 7 www-data www-data 4096 mai   15 11:00 dev\r\ndrwxr-xr-x 5 www-data www-data 4096 mai   15 11:00 prod\r\n<\/pre>\n<p>Pourtant j&rsquo;avais bien dit \u00e0 <em>chmod<\/em> de donner les droits en \u00e9criture sur ce maudit r\u00e9pertoire ! On dirait qu&rsquo;il ne les a pas propag\u00e9s aux sous-r\u00e9pertoires&#8230;Bizarre.<br \/>\nQu&rsquo;\u00e0 cela ne tienne, je continue dans ma logique Rambo, je les aurais tous \u00e0 la force de la Ranger cir\u00e9e !<\/p>\n<blockquote><p>sudo chmod -R g+w app\/cache\/<\/p><\/blockquote>\n<p>ENFIN JE TRIOMPHE ! *rire d\u00e9moniaque*<br \/>\nJe viens de lancer le nettoyage du cache en dev et il s&rsquo;est effectu\u00e9 comme il faut, la preuve !<\/p>\n<blockquote><p>seb@debian:\/var\/www\/Symfony$ app\/console cache:clear &#8211;env=dev<br \/>\nClearing the cache for the dev environment with debug true<\/p><\/blockquote>\n<p>Passablement ragaillardi par cette victoire sur la machine, je retourne donc en d\u00e9coudre avec la programmation, puis je fais un F5 sur mon client HTTP favori. H-O-R-R-E-U-R !!!<\/p>\n<blockquote><p>RuntimeException: Failed to write cache file \u00ab\u00a0\/var\/www\/Symfony\/app\/cache\/dev\/classes.php\u00a0\u00bb.<\/p><\/blockquote>\n<p>Ce coup-ci c&rsquo;en est trop, des tas d&rsquo;id\u00e9es vous passent par la t\u00eate et notamment la reconversion professionnelle&#8230;C&rsquo;est s\u00fbr et certain, la machine vous en veut !<\/p>\n<p>Regardons le r\u00e9pertoire de cache :<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nseb@debian:\/var\/www\/Symfony$ ls -l app\/cache\/\r\ntotal 8\r\ndrwxrwxr-x 6 seb      seb      4096 mai   15 11:32 dev\r\ndrwxrwxr-x 5 www-data www-data 4096 mai   15 11:00 prod\r\n<\/pre>\n<p>Bon sang, l&rsquo;utilisateur <em>seb<\/em> a os\u00e9 imposer SON groupe en lieu et place de celui que j&rsquo;avais d\u00e9fini !!! De deux choses l&rsquo;une, soit je trouve une solution \u00e0 ce probl\u00e8me et vite, soit je joue \u00e9ternellement au ping-pong avec les droits de mes deux utilisateurs et je ne garantis aucunement de continuer de jouir de l&rsquo;ensemble de mes facult\u00e9s mentales \u00e0 la fin de la journ\u00e9e. Pire : d\u00e9go\u00fbt\u00e9 de ce cirque, je pourrais me tourner vers Zend ! (je plaisante, ne tapez pas !)<\/p>\n<h1>Ou\u00e8re iz zeu probl\u00e8me ?<\/h1>\n<p>Mes utilisateurs acc\u00e8dent en concurrence aux m\u00eames r\u00e9pertoires : d\u00e8s que je modifie les permissions de l&rsquo;un, c&rsquo;est l&rsquo;autre qui se voit refuser l&rsquo;\u00e9criture. \u00c7a peut durer longtemps ! J&rsquo;\u00e9tais sur la bonne piste en d\u00e9cidant de cr\u00e9er un seul groupe, mais je ne suis pas all\u00e9 au bout de la solution !<\/p>\n<h1>Victime de chmod, tel est ton nom de code !<\/h1>\n<p>Un de mes probl\u00e8mes vient du fait qu&rsquo;un utilisateur, <em>www-data<\/em> ou <em>seb<\/em>, ne respecte pas les droits du r\u00e9pertoire parent dans lequel il cr\u00e9e le sien. Pour cela, il me faut faire usage de l&rsquo;option +s de chmod, voyez plut\u00f4t :<\/p>\n<blockquote><p>chmod g+s cache\/ logs\/<\/p><\/blockquote>\n<p>Cette option <strong>setgid<\/strong> (<em>set group id<\/em>), lorsqu&rsquo;elle est appliqu\u00e9e sur un r\u00e9pertoire, permet de dire la chose suivante : \u00ab\u00a0tout fichier\/r\u00e9pertoire cr\u00e9\u00e9 dans CE r\u00e9pertoire h\u00e9ritera des droits DE GROUPE du r\u00e9pertoire de base au lieu d&rsquo;h\u00e9riter des droits DU GROUPE de l&rsquo;utilisateur qui l&rsquo;a cr\u00e9e\u00a0\u00bb. Ceci va r\u00e9soudre une partie de mon probl\u00e8me car seb ne s&rsquo;arrogera pas le droit d&rsquo;\u00e9craser la valeur de groupe <em>www-data<\/em> par la sienne (<em>seb<\/em>) ! Cependant, il faut un moyen de dire que nous souhaitons que nos deux utilisateurs maintiennent les droits EN ECRITURE de leur groupe commun, qui rappelons le est <em>www-data<\/em> !<\/p>\n<h1>Umask to the rescue !<\/h1>\n<p>Nous voulons pouvoir dire :<\/p>\n<ul>\n<li>Les utilisateurs <em>seb<\/em> et <em>www-data<\/em> doivent r\u00e9pliquer les droits <em>de groupe<\/em> du r\u00e9pertoire de base<\/li>\n<li>Les utilisateurs <em>seb<\/em> et <em>www-data<\/em> doivent garantir que tout fichier ou tout r\u00e9pertoire cr\u00e9\u00e9 sera <em>writeable<\/em> par quiconque appartient au groupe www-data<\/li>\n<\/ul>\n<p>Nous avons d\u00e9j\u00e0 assur\u00e9 la premi\u00e8re partie, comment garantir que mes deux utilisateurs donneront le droit d&rsquo;\u00e9criture \u00e0 leur groupe en toutes circonstances ?<\/p>\n<p>En positionnant le <strong>umask<\/strong> de l&rsquo;un et de l&rsquo;autre \u00e0 la m\u00eame valeur : 0002.<br \/>\nPourquoi ce 0002 ? Le premier 0 indique une notation octale, mais ce n&rsquo;est pas tr\u00e8s int\u00e9ressant&#8230;Ce qui nous int\u00e9resse c&rsquo;est 002 ! 0 correspond aux droits de l&rsquo;utilisateur (U), le second 0 aux droits du groupe (G) et le 2 aux autres (O, pour <em>others<\/em>), un bon moyen mn\u00e9motechnique consiste \u00e0 retenir le pr\u00e9nom Hugo pour se souvenir de la place de chacun (U-G-O).<br \/>\nBref, ce masque nous dit en gros \u00ab\u00a0voici ce que j&rsquo;enl\u00e8ve lorsque tu cr\u00e9e un fichier ou un r\u00e9pertoire\u00a0\u00bb et donc il nous dit dans notre cas \u00ab\u00a0J&rsquo;enl\u00e8ve le droit d&rsquo;\u00e9criture aux autres\u00a0\u00bb. Souvenez-vous que les droits sont les suivants : lecture = 4, \u00e9criture = 2, ex\u00e9cution = 1.<br \/>\nEn positionnant mon umask \u00e0 0002, je dis en substance \u00ab\u00a0enl\u00e8ve les droits d&rsquo;\u00e9criture \u00e0 others et laisse le reste intact\u00a0\u00bb, donc j&rsquo;aurais finalement 775 comme droits sur tout ce que je m&rsquo;appr\u00eate \u00e0 cr\u00e9er !<\/p>\n<p>Pour voir l&rsquo;\u00e9tat de votre <em>umask<\/em>, et donc de voir s&rsquo;il y a besoin de le modifier, tapez simplement <strong>umask<\/strong> en ligne de commande.<\/p>\n<p>Il y a de fortes chances pour qu&rsquo;il soit par d\u00e9faut \u00e0 0022, dans ce cas l\u00e0 il faudra le changer en faisant simplement <strong>umask 0002<\/strong> puis <strong>umask<\/strong> pour v\u00e9rifier que le bon s&rsquo;affiche dor\u00e9navant. <strong>Attention toutefois, ce changement ne dure que le temps de votre session<\/strong>, il faudra penser \u00e0 reporter cette commande dans votre fichier .bashrc, par exemple.<\/p>\n<h1>Nous y sommes ! Enfin, presque !<\/h1>\n<p>Un seul utilisateur a bascul\u00e9 son umask, c&rsquo;est l&rsquo;utilisateur CLI ! Il faut faire la m\u00eame chose c\u00f4t\u00e9 utilisateur Web, www-data, donc ! Nous rajoutons cette ligne au d\u00e9but des fichiers app_dev.php et console.php :<strong> umask(0002);<\/strong><\/p>\n<p>Ainsi, que nous cr\u00e9ions des objets dans le <em>filesystem<\/em> avec la commande Symfony console, avec l&rsquo;utilisateur Web via l&rsquo;appel au contr\u00f4leur frontal de dev ou encore directement avec l&rsquo;utilisateur qui manipule la ligne de commande, nous aurons \u00e0 terme les m\u00eames droits !<\/p>\n<h1>Que dit la doc ?<\/h1>\n<p>Il est dit qu&rsquo;il faut privil\u00e9gier les ACL au d\u00e9triment du umask car umask n&rsquo;est pas totalement fiable. Soyons francs, quand on d\u00e9bute, on n&rsquo;a pas forc\u00e9ment envie de s&rsquo;improviser <em>sysadmin<\/em> et de s&rsquo;attaquer aux ACL (de plus on peut tr\u00e8s bien ne pas y avoir acc\u00e8s, en entreprise par exemple). Pour d\u00e9buter ou encore d\u00e9velopper en environnement local, nul besoin de mettre la barre trop haut, une modification du umask suffira largement.<\/p>\n<p>Je vous recommande dans tous les cas la lecture \u00e0 l&rsquo;URL suivant : <a href=\"http:\/\/symfony.com\/doc\/current\/book\/installation.html#configuration-and-setup\" target=\"_blank\">http:\/\/symfony.com\/doc\/current\/book\/installation.html#configuration-and-setup<\/a><\/p>\n<h1>R\u00e9sum\u00e9<\/h1>\n<p>La TODO list, pour finir :<\/p>\n<ul>\n<li>Mettez votre utilisateur CLI et votre utilisateur Web dans le m\u00eame groupe<\/li>\n<li>Faites un chmod g+s sur les r\u00e9pertoires qui posent probl\u00e8me : cache et logs<\/li>\n<li>Changez le umask de votre utilisateur CLI dans .bashrc et dans le fichier app\/console, faites de m\u00eame pour l&rsquo;utilisateur Web dans app_dev.php et app.php<\/li>\n<\/ul>\n<p>Bon d\u00e9veloppement \u00e0 tous et \u00e0 toutes !<\/p>\n<div id=\"attachment_971\" style=\"width: 522px\" class=\"wp-caption alignnone\"><a href=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/blue_sky-wide.jpg\"><img aria-describedby=\"caption-attachment-971\" loading=\"lazy\" src=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/blue_sky-wide.jpg\" alt=\"Beau ciel bleu\" width=\"512\" height=\"320\" class=\"size-full wp-image-971\" srcset=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/blue_sky-wide.jpg 512w, http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/blue_sky-wide-300x187.jpg 300w\" sizes=\"(max-width: 512px) 100vw, 512px\" \/><\/a><p id=\"caption-attachment-971\" class=\"wp-caption-text\">Le cache n&rsquo;est plus un soucis, l&rsquo;horizon est d\u00e9gag\u00e9, vous \u00eates calme et d\u00e9tendu(e)&#8230;<\/p><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Symfony, qu&rsquo;est-ce que tu nous cache ? Que vous soyez un utilisateur avanc\u00e9 ou d\u00e9butant du c\u00e9l\u00e8bre framework MVC bas\u00e9 sur PHP, vous avez forc\u00e9ment t\u00f4t ou tard du affronter cet \u00e9cueil : mettre \u00e0 jour le cache fichier de Symfony ! Le sc\u00e9nario est le suivant : vous installez la derni\u00e8re version de votre [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0},"categories":[40,3,76],"tags":[77],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v19.6.1 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Symfony 2 : en finir avec le nettoyage du cache via cache:clear ! - La Fabrique de code - Tech blog<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/\" \/>\n<meta property=\"og:locale\" content=\"fr_FR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Symfony 2 : en finir avec le nettoyage du cache via cache:clear ! - La Fabrique de code - Tech blog\" \/>\n<meta property=\"og:description\" content=\"Symfony, qu&rsquo;est-ce que tu nous cache ? Que vous soyez un utilisateur avanc\u00e9 ou d\u00e9butant du c\u00e9l\u00e8bre framework MVC bas\u00e9 sur PHP, vous avez forc\u00e9ment t\u00f4t ou tard du affronter cet \u00e9cueil : mettre \u00e0 jour le cache fichier de Symfony ! Le sc\u00e9nario est le suivant : vous installez la derni\u00e8re version de votre [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/\" \/>\n<meta property=\"og:site_name\" content=\"La Fabrique de code - Tech blog\" \/>\n<meta property=\"article:published_time\" content=\"2014-05-15T11:57:39+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2016-07-25T07:38:03+00:00\" \/>\n<meta property=\"og:image\" content=\"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/dicentim-1.gif\" \/>\n<meta name=\"author\" content=\"admin\" \/>\n<meta name=\"twitter:card\" content=\"summary\" \/>\n<meta name=\"twitter:creator\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:site\" content=\"@LaFabrique2Code\" \/>\n<meta name=\"twitter:label1\" content=\"\u00c9crit par\" \/>\n\t<meta name=\"twitter:data1\" content=\"admin\" \/>\n\t<meta name=\"twitter:label2\" content=\"Dur\u00e9e de lecture estim\u00e9e\" \/>\n\t<meta name=\"twitter:data2\" content=\"10 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/\",\"name\":\"Symfony 2 : en finir avec le nettoyage du cache via cache:clear ! - La Fabrique de code - Tech blog\",\"isPartOf\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\"},\"datePublished\":\"2014-05-15T11:57:39+00:00\",\"dateModified\":\"2016-07-25T07:38:03+00:00\",\"author\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\"},\"breadcrumb\":{\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/#breadcrumb\"},\"inLanguage\":\"fr-FR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Accueil\",\"item\":\"http:\/\/www.lafabriquedecode.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Symfony 2 : en finir avec le nettoyage du cache via cache:clear !\"}]},{\"@type\":\"WebSite\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#website\",\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/\",\"name\":\"La Fabrique de code - Tech blog\",\"description\":\"PHP objet, MySQL, Design Patterns, OOP...et plus !\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}\"},\"query-input\":\"required name=search_term_string\"}],\"inLanguage\":\"fr-FR\"},{\"@type\":\"Person\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162\",\"name\":\"admin\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"fr-FR\",\"@id\":\"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"contentUrl\":\"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g\",\"caption\":\"admin\"},\"url\":\"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Symfony 2 : en finir avec le nettoyage du cache via cache:clear ! - La Fabrique de code - Tech blog","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/","og_locale":"fr_FR","og_type":"article","og_title":"Symfony 2 : en finir avec le nettoyage du cache via cache:clear ! - La Fabrique de code - Tech blog","og_description":"Symfony, qu&rsquo;est-ce que tu nous cache ? Que vous soyez un utilisateur avanc\u00e9 ou d\u00e9butant du c\u00e9l\u00e8bre framework MVC bas\u00e9 sur PHP, vous avez forc\u00e9ment t\u00f4t ou tard du affronter cet \u00e9cueil : mettre \u00e0 jour le cache fichier de Symfony ! Le sc\u00e9nario est le suivant : vous installez la derni\u00e8re version de votre [&hellip;]","og_url":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/","og_site_name":"La Fabrique de code - Tech blog","article_published_time":"2014-05-15T11:57:39+00:00","article_modified_time":"2016-07-25T07:38:03+00:00","og_image":[{"url":"http:\/\/www.lafabriquedecode.com\/blog\/wp-content\/uploads\/2014\/05\/dicentim-1.gif"}],"author":"admin","twitter_card":"summary","twitter_creator":"@LaFabrique2Code","twitter_site":"@LaFabrique2Code","twitter_misc":{"\u00c9crit par":"admin","Dur\u00e9e de lecture estim\u00e9e":"10 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/","url":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/","name":"Symfony 2 : en finir avec le nettoyage du cache via cache:clear ! - La Fabrique de code - Tech blog","isPartOf":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website"},"datePublished":"2014-05-15T11:57:39+00:00","dateModified":"2016-07-25T07:38:03+00:00","author":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162"},"breadcrumb":{"@id":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/#breadcrumb"},"inLanguage":"fr-FR","potentialAction":[{"@type":"ReadAction","target":["http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/"]}]},{"@type":"BreadcrumbList","@id":"http:\/\/www.lafabriquedecode.com\/blog\/2014\/05\/symfony-2-en-finir-nettoyage-du-cache-via-cacheclear\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Accueil","item":"http:\/\/www.lafabriquedecode.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Symfony 2 : en finir avec le nettoyage du cache via cache:clear !"}]},{"@type":"WebSite","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#website","url":"http:\/\/www.lafabriquedecode.com\/blog\/","name":"La Fabrique de code - Tech blog","description":"PHP objet, MySQL, Design Patterns, OOP...et plus !","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"http:\/\/www.lafabriquedecode.com\/blog\/?s={search_term_string}"},"query-input":"required name=search_term_string"}],"inLanguage":"fr-FR"},{"@type":"Person","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/83863c048b82fd9ccf6407bddd241162","name":"admin","image":{"@type":"ImageObject","inLanguage":"fr-FR","@id":"http:\/\/www.lafabriquedecode.com\/blog\/#\/schema\/person\/image\/","url":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","contentUrl":"http:\/\/0.gravatar.com\/avatar\/fc2e1de7c8a1871b50ff9c6a6f8682a2?s=96&d=retro&r=g","caption":"admin"},"url":"http:\/\/www.lafabriquedecode.com\/blog\/author\/admin\/"}]}},"_links":{"self":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/954"}],"collection":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/comments?post=954"}],"version-history":[{"count":18,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/954\/revisions"}],"predecessor-version":[{"id":1078,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/posts\/954\/revisions\/1078"}],"wp:attachment":[{"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/media?parent=954"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/categories?post=954"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.lafabriquedecode.com\/blog\/wp-json\/wp\/v2\/tags?post=954"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}