16

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

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

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

我的问题:

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

提前感谢大家:-)

4

6 回答 6

9

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

解决方案是在部署的最后一个命令清除缓存,并指定--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

它没有很好的文档记录,但您也可以在环境移动到current使用部署后挂钩来预热缓存。同样在.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      
于 2013-05-21T07:45:12.363 回答
3

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

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

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

于 2014-12-04T00:37:50.277 回答
1

我花了一些时间试图让事情以可重用的方式工作,这是我们最终确定的 ebextensions 文件。

files:
  "/tmp/parameters.yml":
    mode: "000444"
    content: |
      parameters:
        database_driver: pdo_mysql
        database_host: '...'
        database_port: null
        database_name: ...
        database_user: ...
        database_password: ...
        mailer_transport: smtp
        mailer_host: 127.0.0.1
        mailer_user: null
        mailer_password: null
        locale: en
        secret: ...

option_settings:
  - namespace: aws:elasticbeanstalk:hostmanager
    option_name: LogPublicationControl
    value: true
  - namespace: aws:elasticbeanstalk:container:php:phpini
    option_name: document_root
    value: /web
  - namespace: aws:autoscaling:launchconfiguration # This is for permission to the RDS instance
    option_name: SecurityGroups
    value: ...

container_commands:
  01-params:
    command: cp /tmp/parameters.yml app/config/parameters.yml
  02-params:
    command: chown webapp:webapp app/config/parameters.yml
  03-bootsrap:
    command: php vendor/sensio/distribution-bundle/Sensio/Bundle/DistributionBundle/Resources/bin/build_bootstrap.php
  04-bootsrap:
    command: chown webapp:webapp app/bootstrap.php.cache
  05-cache:
    command: php app/console cache:clear --env=prod --no-debug --no-warmup
  06-cache:
    command: chmod -R 0777 app/cache
  07-logs:
    command: chmod -R 0777 app/logs
  08-cache:
    command: chown -R webapp:webapp app/cache
  09-logs:
    command: chown -R webapp:webapp app/logs
于 2014-03-15T12:50:01.400 回答
1

我有同样的问题,我在这个页面上找到了解决方案

我的最终代码是 - 我正在使用 Symfony 框架(v2.8):

commands:
  01_create_post_dir:
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
    ignoreErrors: true

files:
  "/opt/elasticbeanstalk/hooks/appdeploy/post/initial_cron_job.sh":
  mode: "000755"
  owner: root
  group: root
  content: |
    #!/usr/bin/env bash
    # This line was very important for me as I needed to get EnvVars
    . /opt/elasticbeanstalk/support/envvars
    rm -rf /var/app/current/app/cache/* /var/app/current/app/logs/*
    chmod -R 777 /var/app/current/app/cache
    chmod -R 777 /var/app/current/app/logs
    su -c "command_name" $EB_CONFIG_APP_USER

解释词:

  • 我不需要预热缓存,所以我对缓存日志文件夹执行 rm -rf
  • 我将缓存和日志文件夹权限更改为 100% 确保它们对于 $EB_CONFIG_APP_USER 是可写的 - 在这种情况下是webapp用户
于 2016-04-29T13:21:12.283 回答
0

尝试覆盖 getCacheDir?

在 app/AppKernel.php 中:

public function getCacheDir()
{
    return "/path/to/the/cache";
}
于 2013-02-28T07:35:00.310 回答
0

根据@rhunwicks 的回答,这是我的.ebextensions/symfony.config

commands:
  01updateComposer:
    command: export COMPOSER_HOME=/root && /usr/bin/composer.phar self-update

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:clear --env=prod
      php app/console assetic:dump --env=prod

确保在您的作曲家中,无需"symfony-assets-install": "symlink"花费数小时试图弄清楚为什么符号链接指向/var/app/ondeck/src/BundleName/MyBundle/Resources/public而不是current文件夹。

于 2014-09-28T13:21:48.263 回答