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

标签 php amazon-web-services symfony-2.1 amazon-elastic-beanstalk

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

经过一番挖掘,我发现 Symfony2 缓存文件本身有绝对路径字符串。我添加的命令运行“预部署”或在应用程序文件从它们的暂存文件夹(称为“/var/app/ondeck”)移动到它们的最终存放位置(“/var/app/current”)之前运行。结果,缓存文件中的绝对路径字符串错误,导致应用无法加载。

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

我的问题:

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

提前谢谢大家:-)

最佳答案

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

解决方案是清除缓存作为部署的最后一个命令并指定--no-warmup来阻止Symfony自动重新填充它,这样当环境从移动时缓存为空ondeckcurrent。在我的 .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

它没有很好的记录,但您也可以使用部署后 Hook 来预热缓存 after 环境已移动到当前。同样在 .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      

关于php - 将 Symfony2 应用程序部署到 AWS Elastic Beanstalk - 部署后缓存清除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14124246/

相关文章:

php - MySQL 按连接值分组并获取每个组内的第一个 id (UUID)

php - PHP switch语句中跳转到另一个case

php - 如何计算以特定字母开头但仍包含 '0' 字母的类别

amazon-web-services - 自动删除AWS Lambdas版本

php - SF2.1 RC1 - 没有要处理的元数据类

php - 如何在 Symfony 2.1 中使用 Composer 安装自己的包?

PHP的exec()无法访问网络驱动器

amazon-web-services - kubernetes 没有为 ingress-nginx Controller 创建 ELB

postgresql - 让 Doctrine 2 ORM 通过针对具有连接的表的自定义查询来混合对象

security - 在 Amazon S3 中,我需要什么权限才能获取对象的 HEAD?