如何在Symfony3.4的控制器中清除缓存?

4

将Symfony从3.3升级到3.4后,我的函数不起作用了(之前是可以的)。我必须在控制器中清除缓存,当我执行下面的命令时,函数返回错误。

exec(sprintf(
  "php %s/bin/console cache:clear --env=prod",
  $this->getParameter('kernel.project_dir')
));

它会返回类似于这样的内容:
Fatal error: require(): Failed opening required '/[...]/var/cache/prod/ContainerAcrshql/getTwig_ExceptionListenerService.php' (include_path='.:/usr/local/share/pear') in /[...]/var/cache/prod/ContainerAcrshql/appProdProjectContainer.php on line 764 Fatal error: require(): Failed opening required '/[...]/var/cache/prod/ContainerAcrshql/getSwiftmailer_EmailSender_ListenerService.php' (include_path='.:/usr/local/share/pear') in /[...]/var/cache/prod/ContainerAcrshql/appProdProjectContainer.php on line 764

此外,我可以告诉您,在开发环境中它可以正常工作。当项目在本地运行并模拟生产环境时(在地址栏中输入localhost:8000后面加上app.php),也可以正常工作。我没有其他服务器来检查问题是否仍然存在。

1
你确定要清除这个缓存吗?你在做什么需要清除这个缓存? - svgrafov
当然可以。我允许通过管理员面板更改翻译文件。我将全局设置存储在yml文件中,用户也可以通过管理员面板更改它。 - jdoe
1
使用数据库完成这个任务,就像每个理智的人一样。你不想仅仅因为更改翻译而导致停机时间。 - svgrafov
@preciel 我已经使用Composer完成了这个操作链接,看起来一切都很好(除了这个缓存...)。 - jdoe
@Preciel - 我知道这不是主题,但我通过编辑composer.json将许多应用程序从3.x移动到3.4。我刚刚进行了3.3的全新安装,并且没有遇到任何问题就将其移动到了3.4。我知道可能会有困难,我自己也经常陷入composer地狱中,我永远不会尝试跳过主要版本,但次要版本的东西基本上可以直接使用。 - Cerad
显示剩余7条评论
2个回答

8

我正在调用已经实现的Symfony命令来清理或预热缓存(在Symfony 4上进行了测试)。

use Symfony\Bundle\FrameworkBundle\Console\Application;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Console\Input\ArrayInput;
use Symfony\Component\Console\Output\BufferedOutput;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\KernelInterface;

class CommandController extends AbstractController
{

    /**
     *
     * @Route("/command/cache/clear", name="command_cache_clear")
     */
    public function command_cache_clear(KernelInterface $kernel)
    {
        return $this->do_command($kernel, 'cache:clear');
    }

    /**
     *
     * @Route("/command/cache/warmup", name="command_cache_warmup")
     */
    public function command_cache_warmup(KernelInterface $kernel)
    {
        return $this->do_command($kernel, 'cache:warmup');
    }

    private function do_command($kernel, $command)
    {
        $env = $kernel->getEnvironment();
        
        $application = new Application($kernel);
        $application->setAutoExit(false);
        
        $input = new ArrayInput(array(
            'command' => $command,
            '--env' => $env
        ));
        
        $output = new BufferedOutput();
        $application->run($input, $output);
        
        $content = $output->fetch();
        
        return new Response($content);
    }
}

0

你应该添加有效的权限到 var/ 目录以访问缓存文件:

chmod ... var/ -R

从 Web 访问时使用的用户是 www-data


当我检测到错误时,那是我做的第一件事。 - jdoe
所以,您应该验证 kernel.project_dir 是否包含指向项目的有效路径。 - T. AKROUT
你可以用 __DIR__ . '/../../..' 替换 $this->getParameter('kernel.project_dir')。 - T. AKROUT
这是下一次尝试。我还检查了命令 rm -rf ~/[...]/var/cache,并尝试使用 'Symfony\Component\Filesystem\Filesystem' 方法删除。 - jdoe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接