我的Symfony安装似乎已经在某处混淆了(可能是在缓存失败的情况下)。似乎认为生产缓存文件夹应该被称为pro_
而不是prod
。
首先,当我尝试运行$ php console cache:clear --env=prod
时,收到了错误消息:
[Symfony\Component\Filesystem\Exception\IOException]
Cannot rename "...cache/pro_" to "...cache/pro_".
我在Windows开发机器上运行(因此没有文件系统权限问题)。
因此,我尝试手动删除所有cache/*
文件/文件夹,然后重试。这次cache:clear经历并生成了一个prod
文件夹。该文件夹包含注释,资产,学说,会话和树枝的子文件夹。
但是当我打开prod前端控制器(例如浏览器中的http://devsite/
)时,它会失败并显示以下消息:
Fatal error: require() [function.require]:
Failed opening required '...cache/pro_/doctrine/orm/Proxies\__CG__AcmeDemoBundleEntityFoo.php'
(include_path='blah, blah, blah')
in ...\vendor\doctrine\common\lib\Doctrine\Common\Proxy\AbstractProxyFactory.php on line 165
从它的外观来看,它试图在pro_而不是prod(再次)中访问缓存文件。
查看缓存文件夹,我可以看到缓存\ prod下存在__CG__AcmeDemoBundleEntityFoo.php
,但现在有一个带注释和会话子文件夹的pro_文件夹。
发生了什么,如何让Symfony忘记pro_
,以便它可以重新使用prod
来解决所有问题?
我认为与缓存有关的一切都存储在缓存文件夹下......是否有其他东西(某处)存储了对pro_
的一些引用?或者我是否在寻找解决此问题的错误位置?
修改:再进行一些搜索,appProdProjectContainer.php
包含16个.../cache/pro_
的引用。如果我手动搜索并将这些替换为.../cache/prod
,则该网站可以正常运行。但下次我运行console cache:clear
时会将其重置为pro_
。这种错误的行为可能来自哪里?
Edit2:好的,我已经深入了解并向Symfony核心提交了一个PR来尝试修复它。问题是由我们的缓存路径包含'\'字符引起的,这些字符随后在缓存文件中被转义,并且无法匹配用于清理它们的搜索/替换命令。
答案 0 :(得分:2)
app/console cache:clear --env=prod --no-warmup
composer dump-autoload -o
app/console cache:warmup --env=prod
答案 1 :(得分:1)
这是Symfony处理缓存路径时出现反斜杠的错误。
短期解决方法是用正斜杠替换它们。
从长期来看,有一个修补程序发布为https://github.com/symfony/symfony/pull/9184,很快就会被纳入核心代码。