app/console cache:clearするときは--no-warmupオプションつけると幸せ

先日行われたSymfony2勉強会に参加してきました。
会場を提供してくれたZynga Japanさん、企画開催をしてくださったスタッフの皆さん、プレゼンを発表された方々、一緒に参加した皆さんに感謝です。すばらしいイベントだったので今後も参加していきたいですね。

さて、symfony1を使っている方がSymfony2をさわって一番最初につまづくのがsymfony ccに変わるapp/console cache:clearの挙動だと思うんです。

symfony1でcache:clearを行うとcacheディレクトリ以下のファイルを全削除して終わりだったのですが、Symfony2のapp/console cache:clearを動かすとcacheディレクトリ以下のファイルを消した後に再作成を行います

その結果webサーバーの実行ユーザーとapp/consoleを実行したユーザーとが違う場合、書き込み時などに権限が云々とエラーが発生してしまいドハマリします。自分はつまづきました。

yamlの記述間違いがキャッシュされてしまうのでクリアする、しかしブラウザ上で確認してみるとキャッシュファイルへ書き込み権限でエラーになる、そんな悲痛な叫びがワークショップでも聞こえました。
僕は 男は黙ってrm -fr app/cache/* などと物騒なことをつぶやいてみたりもしたのですが、あまりにも物騒です。まねしちゃだめです。

こんなときにはno-warmupオプションを使います。

php app/console cache:clear --no-warmup

このオプションをつけることでファイルの再作成を行わなくなります。

実際にはどんな風に動いているのか、
プロジェクトディレクトリ/vendor/symfony/src/Symfony/Bundle/FrameworkBundle/Command/CacheClearCommand.phpを覗いてみるとわかります。

該当部分の抜粋です。

<?php

..

$realCacheDir = $this->container->getParameter('kernel.cache_dir');
$oldCacheDir  = $realCacheDir.'_old';

if (!is_writable($realCacheDir)) {
    throw new \RuntimeException(sprintf('Unable to write in the "%s" directory', $realCacheDir));
}

if ($input->getOption('no-warmup')) {
    rename($realCacheDir, $oldCacheDir);
} else {
    $warmupDir = $realCacheDir.'_new';

    $this->warmup(!$input->getOption('without-debug'), $warmupDir);

    rename($realCacheDir, $oldCacheDir);
    rename($warmupDir, $realCacheDir);
}

$this->container->get('filesystem')->remove($oldCacheDir);

というわけで、no-warmupオプションをつけると幸せになれるよというお話でした。


……ときにapp/console ccとか動かすパッチはニーズがありますかね?あれば書いてみます。