将 Symfony2 应用程序部署到 AWS Elastic Beanstalk - 部署后缓存清除

将 Symfony2 应用程序部署到 Elastic Beanstalk 时,我需要执行手动缓存清除,以便应用程序开始运行。因此,我添加了一个容器命令,以便在部署期间清除 prod 缓存。命令运行,但我仍然必须手动清除才能使应用程序正常工作。

经过一番挖掘,我发现Symfony2缓存文件本身中有绝对的路径字符串。我添加的命令在“预部署”或应用文件从其暂存文件夹(称为'/var/app/ondeck')移动到其最终休息地点('/var/app/current')之前运行。因此,缓存文件中的绝对路径字符串错误,应用无法加载。

此外,开发环境可以立即正常工作,因为它会自动重新构建自己的缓存。生产环境是唯一受影响的环境。

我的问题:

  • 有没有办法在代码移动到位后自动运行缓存清除命令?
  • 或者,有没有办法让Symfony2允许您为缓存生成指定不同的“基本路径”?这样就可以将其设置为指向正确的最终位置。

提前感谢大家:-)


答案 1

出现此问题的原因是,当各种 Symfony 命令在 composer 安装过程和/或您自己的命令(例如 assetic:dump)结束时运行时,缓存在平台环境中被填充。

解决方案是清除缓存作为部署的最后一个命令,并指定 --no-warmup 以阻止 Symfony 自动重新填充它,以便在环境从 ondeck 移动到 current 时缓存为空。在我的.ebextensions/symfony.config中,我有:

container_commands:
  01_migrate:
    command: php app/console doctrine:migrations:migrate --env=prod --no-debug --no-interaction
    leader_only: true
  02_dumpassets:
    command: php app/console assetic:dump --env=prod --no-debug
  99_clearcache:
    command: php app/console cache:clear --env=prod --no-debug --no-warmup

它没有很好的文档记录,但你也可以使用部署后挂钩在环境移动到当前环境后预热缓存。同样在 .ebextensions/symfony.config 中:

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/01-cachewarm.sh":
    mode: "000755"
    owner: root
    group: root
    content: |
      #!/usr/bin/env bash
      . /opt/elasticbeanstalk/support/envvars
      cd $EB_CONFIG_APP_CURRENT
      php app/console cache:warmup --env=prod --no-debug      

答案 2

此问题已在最新的 Symfony 发行版 2.3.23、2.5.8、2.6.1 和即将推出的版本(2.7.、3.、 ...)中得到修复。

查看 https://github.com/heroku/heroku-buildpack-php/issues/64

Symfony现在将在容器中使用相对于FILE的链接,因此您不再需要使用后期部署黑客。请注意,您仍然需要将资产安装为硬链接。


推荐