プロジェクトの管理パネルで、使用するデータベース名を変更する機能をプログラムしました。に新しいデータベース名を書き込んparameters.ini
だ後、新しい構成をロードするためにキャッシュをクリーンアップする必要がありました。
consoleコマンドを実行せずにキャッシュをクリーンアップする最良の方法は何ですか?
または、現在のデータベースを変更する別のベストプラクティスはありますか。
次の方法でコンソールコマンドを使用できますexec()
。
exec("php /my/project/app/console cache:clear --env=prod");
または、コンソールコマンドを使用したくない場合は 、単にcache/フォルダーを空にします。
次のアクションを呼び出して、キャッシュをクリアできます。
/**
* @Route("/cache/clear", name="adyax_cache_clear")
*/
public function cacheClearAction(Request $request) {
$input = new \Symfony\Component\Console\Input\ArgvInput(array('console','cache:clear'));
$application = new \Symfony\Bundle\FrameworkBundle\Console\Application($this->get('kernel'));
$application->run($input);
}
最新の最良の方法(2017)。私はこれをコントローラーで作成しています:
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Output\BufferedOutput;
/**
* Refresh Cache
*/
public function refreshRoutes()
{
$kernel = $this->container->get('kernel');
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput([
'command' => 'cache:clear',
'--env' => 'prod',
]);
$output = new BufferedOutput();
$application->run($input, $output);
}
Success
ページのレンダリングに関する私の作業アクション。シャットダウン時にキャッシュをクリアします。
public function clearCacheAction(Request $request)
{
$dir = $this->get('kernel')->getRootDir() . '/cache';
register_shutdown_function(function() use ($dir) {
`rm -rf $dir/*`;
});
return $this->render('SomeBundle:SomePart:clearCache.html.twig');
}
session:
config.ymlで設定しなかった場合、セッションが失われることに注意してください。
@HelpNeederの答えは良いですが、ClearCacheコマンドは指定された--envオプションを使用していません。代わりに、アプリケーションが実行されている現在のカーネルを使用しています。
したがって、コントローラーを呼び出す環境とは別の環境で機能するには、コードを少し調整する必要があります(彼の回答を編集することはできません。編集キューがいっぱいであると言っています)。したがって、より完全な回答があります。
//YourBundle:YourController
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Component\Console\Output\BufferedOutput;
public function clearCacheAction($env = 'dev', $debug = true)
{
$kernel = new \AppKernel($env, $debug);
$application = new Application($kernel);
$application->setAutoExit(false);
$input = new ArrayInput([
'command' => 'cache:clear'
]);
$output = new BufferedOutput();
$application->run($input, $output);
return $this->render('someTwigTemplateHere', array('output' => $output->fetch()));
}
次に、ルートを構成します。
cache_clear_dev:
path: /_cache/clear/dev
defaults: { _controller: YourBundle:YourController:clearCache, env: 'dev', debug: true }
cache_clear_prod:
path: /_cache/clear/prod
defaults: { _controller: YourBundle:YourController:clearCache, env: 'prod', debug: false }
これで、Twigテンプレートで{{output}}を使用してコマンドの結果を出力できるようになりました。
アクセス制御を使用している場合は、このルートのアクセス許可をSUPER_ADMINなどに設定することを忘れないでください。管理者以外の人が、キャッシュをクリアできないようにする必要があります。
私はこの方法でキャッシュをクリアしています:
$fs = new Filesystem();
$fs->remove($this->getParameter('kernel.cache_dir'));
彼の答えは多かれ少なかれ時代遅れですが、彼の推薦は今日でも有用です:
答えは驚くほど簡単です。
すべてのキャッシュファイルは、プロジェクトのルートディレクトリにある単一のキャッシュ/ディレクトリに保存されます。
したがって、キャッシュをクリアするには、cache/の下にあるすべてのファイルとディレクトリを削除するだけです。また、symfonyは、存在しない場合に必要なディレクトリ構造を再作成するのに十分なほど賢いです。
Fabien Potencier、2007年11月3日
それで彼の推薦に従って、私はまさにそれをする関数を書きました:
/**
* @Route("/cache/clear", name="maintenance_cache_clear")
*/
public function cacheClearAction(Request $request)
{
$kernel=$this->get('kernel');
$root_dir = $kernel->getRootDir();
$cache_dir = $kernel->getCacheDir();
$success = $this->delTree($cache_dir);
return new Response('...');
}
ここでdelTree($dir_name)
、ディレクトリツリーを再帰的に削除する関数を指定できます。PHPrmdir
関数のユーザー貢献ノートを確認するだけです。たくさんの提案があります。