Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 将Symfony2应用程序部署到AWS Elastic Beanstalk-部署后缓存清除_Php_Amazon Web Services_Symfony 2.1_Amazon Elastic Beanstalk - Fatal编程技术网

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

Php 将Symfony2应用程序部署到AWS Elastic Beanstalk-部署后缓存清除,php,amazon-web-services,symfony-2.1,amazon-elastic-beanstalk,Php,Amazon Web Services,Symfony 2.1,Amazon Elastic Beanstalk,将Symfony2应用程序部署到Elastic Beanstalk时,我需要执行手动缓存清除,以便该应用程序开始运行。因此,我添加了一个container命令来在部署期间清除prod缓存。命令运行,但我仍然必须手动清除,才能让应用程序工作 在仔细研究之后,我发现Symfony2缓存文件本身中存在绝对路径字符串。我添加的命令运行“pre-deployment”或在应用程序文件从其暂存文件夹(称为“/var/app/ondeck”)移动到其最终存放位置(“/var/app/current”)之前。因

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

在仔细研究之后,我发现Symfony2缓存文件本身中存在绝对路径字符串。我添加的命令运行“pre-deployment”或在应用程序文件从其暂存文件夹(称为“/var/app/ondeck”)移动到其最终存放位置(“/var/app/current”)之前。因此,缓存文件中的绝对路径字符串错误,应用程序无法加载

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

我的问题:

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

提前感谢大家:-)

是否尝试重写getCacheDir

在app/AppKernel.php中:

public function getCacheDir()
{
    return "/path/to/the/cache";
}

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

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

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


我花了一些时间尝试以可重用的方式工作,这是我们最终确定的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

根据@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

确保composer中没有
“symfony资产安装”:“symlink”
避免花费数小时试图找出为什么符号链接指向
/var/app/ondeck/src/BundleName/MyBundle/Resources/public
而不是当前的
文件夹。

最新的Symfony发行版修复了此问题 2.3.23、2.5.8、2.6.1和即将发布的版本(2.7、3、…)

Symfony现在将在容器中使用与文件相关的链接,这样您就不需要再使用部署后hack了。
请注意,您仍然需要将资产作为硬链接安装。

我遇到了同样的问题,我在第页找到了解决方案

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

解释词:

  • 我不需要预热缓存,所以我在缓存和日志文件夹上使用rm-rf
  • 我更改缓存和日志文件夹权限,以100%确保它们可为$EB_CONFIG_APP_USER写入-在本例中为webappUSER

您是否正在使用最新的5.4 AMI?我有完全相同的设置,我没有注意到这个问题,但我会做一些挖掘。。。您是使用git部署还是手动上载zip?您好,我正在尝试运行您描述的99_clearcache命令,但出现错误“无法打开输入文件:app/console”。有什么想法吗?谢谢大家!@阿希拉-我相信你在一年半前的评论中就发现了这一点:)但我也遇到了这一点,所以我将为将来可能遇到这一问题的任何人添加一条评论。应用程序路径是
/var/app/current/
,但命令是从文件系统根目录运行的,所以我在命令中使用了绝对路径
/var/app/current/app/console
,这看起来有点不雅观,但效果很好。嗨@Darragh,我认为这是因为您的应用程序的早期版本,但是我想它在第一次部署的情况下不起作用。我甚至不记得这个评论,但是,注意到-谢谢:)嗨,我有同样的问题,我在这里有点困惑。但是在哪里可以找到.ebextensions/symfony.config?它是在我的项目中的某个地方,还是我需要添加它?谢谢你们,这救了我一天。我试图执行cachewarm命令,但aws返回了一个错误,但最新版本的symfony不需要它。谢谢
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
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
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