web-dev-qa-db-ja.com

コンソールコマンドを実行せずにキャッシュを消去する最良の方法は何ですか?

プロジェクトの管理パネルで、使用するデータベース名を変更する機能をプログラムしました。新しいデータベース名をparameters.ini、その後、新しい構成をロードするためにキャッシュをクリーンアップする必要がありました。

コンソールコマンドを実行せずにキャッシュを消去する最良の方法は何ですか?

または、現在のデータベースを変更する別のベストプラクティスがあります。

13
Johni

exec()を介してコンソールコマンドを使用できます。

exec("php /my/project/app/console cache:clear --env=prod");

または、コンソールコマンドを使用しない場合は、単にcache /フォルダを空にします。

16
Samy Dindane

このアクションを呼び出して、キャッシュをクリアできます。

/**
 * @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);
   }
10
Pacufist

最新の最良の方法(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);
}
4
HelpNeeder

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');
}

Config.ymlでsession:を構成しなかった場合、セッションが失われることに注意してください。

1
PLoginoff

@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などに設定することを忘れないでください。管理者以外の誰もがキャッシュをクリアできないようにする必要があります。

1
Tofandel

私はこの方法でキャッシュをクリアしています:

$fs = new Filesystem();
$fs->remove($this->getParameter('kernel.cache_dir'));

https://Gist.github.com/basdek/5501165

0
Stan Fad