在将Symfony2应用程序部署到Elastic Beanstalk时,我需要执行手动缓存清除,以便应用程序开始运行。因此,我在部署期间添加了一个容器命令来清除prod缓存。该命令运行,但我仍然需要手动清除才能使应用程序正常工作。
经过一番挖掘后,我发现Symfony2缓存文件中有绝对路径字符串。我添加的命令运行“预部署”或在应用程序文件从其临时文件夹(称为“/ var / app / ondeck”)移动到其最终休息位置('/ var / app / current')之前运行。因此,缓存文件中的绝对路径字符串是错误的,并且应用程序无法加载。
此外,开发环境可以立即正常运行,因为它会自动重建自己的缓存。 prod环境是唯一受影响的环境。
我的问题:
提前感谢大家: - )
答案 0 :(得分:8)
出现此问题的原因是,当在编辑器安装过程结束时运行各种Symfony命令和/或您自己的命令(例如,assetic:dump)时,缓存在 ondeck 环境中填充。 / p>
解决方案是将缓存清除为部署的最后一个命令,并指定 - no-warmup 以阻止Symfony自动重新填充它,以便在环境移动时缓存为空 ondeck 到当前。在我的 .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
答案 1 :(得分: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。 请注意,您仍需要将资产安装为硬链接。
答案 2 :(得分: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
答案 3 :(得分:1)
我遇到了同样的问题,我在this页面上找到了解决方案
我的最终代码是 - 我正在使用Symfony Framework(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
解释性的话:
答案 4 :(得分:0)
尝试覆盖getCacheDir?
在app / AppKernel.php中:
public function getCacheDir()
{
return "/path/to/the/cache";
}
答案 5 :(得分: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
文件夹的原因。