【问题标题】:Programmatically clear cache on symfony 2以编程方式清除 symfony 2 上的缓存
【发布时间】:2014-07-29 16:55:22
【问题描述】:

我正试图通过我的应用程序清空 Symfony 2 缓存,就像我在做 php app/console cache:clear 一样。

我尝试了许多不同的解决方案,例如:

//solution 1
$process = new Process('php '.__DIR__.'/../../../../../app/console cache:clear');
$process->setTimeout(3600);
$process->run();

//solution 2
$input = new StringInput(null);
$output = new NullConfigurationOutput();
$command = new CacheClearCommand();
$command->setContainer($container);
$command->run($input, $output);

//solution 3    
$container->get('cache_clearer')->clear($container->getParameter('kernel.cache_dir'));

我也试过rm -Rf缓存文件夹。

它们都没有完全正常工作,因为我遇到了很多错误。以下错误是我在解决方案 2 上遇到的错误(这似乎是最好的):

无法启动会话:已由 PHP 启动(已设置 $_SESSION)。

似乎 Symfony 正在尝试在渲染过程中重建页面或重新启动应用程序。

有人如何通过一些 php 代码清除缓存?

编辑: 由于我的路由系统,我实际上正在尝试重新生成缓存。我制作了一个捆绑包,它采用 symfony 2 路由并添加了为 SEO 目的重写它的可能性(例如:我有一个指向 /category 的 front_category 路由,使用这个捆绑包我可以将它重写为 category-seo-optimized。 html)。

如果我在需要特定参数(例如 ID)的路线上,我需要为其创建一个特殊路线以便重写它。例如,对于 /category/3,我需要创建一个名为 category_3 的路由,并且......为了让 symfony 知道我已经更改了路由系统,我必须清除缓存。

【问题讨论】:

标签: php symfony caching


【解决方案1】:

与我刚刚遇到的问题完全相同。 对我来说最简单的解决方案是:

use Symfony\Component\Filesystem\Filesystem;

在控制器中:

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

这将删除当前环境的缓存目录。

【讨论】:

  • 会导致生产服务器宕机。
  • 这会使 Web 服务器挂起并超时。 (交响乐 3.4,PHP 7.1)
【解决方案2】:

这里已经回答了一个类似的问题:Symfony 2.4 execute Command from Controller - 在 3 月 20 日 15:37 pomaxa 回答。

我已经测试并扩展了 pomaxa 的代码

控制器代码

use Symfony\Component\Console\Input\ArgvInput;
use Symfony\Component\Console\Output\ConsoleOutput;

$command = $this->container->get('yourservice.cache.clear');
//$dynamicEnvMode = $this->container->getParameter('kernel.environment')
$staticEnvMode = 'dev'; // to use develop mode
$staticEnvMode = 'prod --no-debug'; // to use production mode
$input = new ArgvInput(array('--env=' . $staticEnvMode ));
$output = new ConsoleOutput();
$command->run($input, $output);

我使用了静态环境模式,并尝试使用 CacheClearCommand 对象而不是服务,但它没有奏效。缓存清除操作可能需要很长时间才能加载,因此使用服务可能会做得更好。

最好的方法是在不清除缓存的情况下解决您的问题。找到快速变化的实体、动作或您需要的任何东西,并为它们禁用缓存。 如果您发布详细问题(并将链接放在评论中),为什么需要忽略缓存以及在哪里,那么我可以帮助您找到其他方式。

【讨论】:

  • 看来此解决方案不适用于 Symfony 3。在 S3 应用程序中,这导致 "Failed to remove file "...\var\cache\prod\sessions\sess_...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-21
  • 2015-07-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多