13

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

consoleコマンドを実行せずにキャッシュをクリーンアップする最良の方法は何ですか?

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

4

7 に答える 7

16

次の方法でコンソールコマンドを使用できますexec()

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

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

于 2012-05-30T12:19:54.717 に答える
10

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

/**
 * @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);
   }
于 2013-09-03T11:46:37.193 に答える
4

最新の最良の方法(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);
}
于 2017-04-23T07:01:38.827 に答える
1

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で設定しなかった場合、セッションが失われることに注意してください。

于 2014-09-25T12:29:01.340 に答える
1

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

于 2017-06-07T12:16:01.813 に答える
0

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

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

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

于 2017-06-25T18:27:10.367 に答える
-1

彼の答えは多かれ少なかれ時代遅れですが、彼の推薦は今日でも有用です:

答えは驚くほど簡単です。

すべてのキャッシュファイルは、プロジェクトのルートディレクトリにある単一のキャッシュ/ディレクトリに保存されます。

したがって、キャッシュをクリアするには、cache/の下にあるすべてのファイルとディレクトリを削除するだけです。また、symfonyは、存在しない場合に必要なディレクトリ構造を再作成するのに十分なほど賢いです。

Fabien Potencier2007年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関数のユーザー貢献ノートを確認するだけです。たくさんの提案があります。

于 2018-02-17T13:55:30.763 に答える