16

Symfony2アプリをElasticBeanstalkにデプロイする場合、アプリが機能し始めるために手動キャッシュクリアを実行する必要があります。そこで、デプロイ中にprodキャッシュをクリアするcontainerコマンドを追加しました。コマンドは実行されますが、アプリが機能するためには手動でクリアする必要がありました。

少し調べてみると、Symfony2のキャッシュファイル自体に絶対パス文字列があることがわかりました。追加したコマンドは、「展開前」、またはアプリファイルがステージングフォルダー(「/ var / app / ondeck」と呼ばれる)から最後の休止場所(「/ var / app / current」)に移動される前に実行されます。その結果、キャッシュファイルの絶対パス文字列が間違っており、アプリの読み込みに失敗します。

また、開発環境は独自のキャッシュを自動的に再構築するため、すぐに正常に機能します。影響を受けるのは本番環境だけです。

私の質問:

  • コードが所定の位置に移動された後、cache clearコマンドを自動的に実行する方法はありますか?
  • あるいは、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 に答える
1

私は同じ問題を抱えていて、このページで解決策を見つけました

そして私の最終的なコードは - 私は 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

説明の言葉:

  • キャッシュをウォームアップする必要がないので、キャッシュログフォルダーで rm -rf を実行します
  • $EB_CONFIG_APP_USER (この場合はwebappユーザー) が書き込み可能であることを 100% 確実にするために、キャッシュ フォルダーとログ フォルダーのアクセス許可を変更します。
于 2016-04-29T13:21:12.283 に答える
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/publiccurrent

于 2014-09-28T13:21:48.263 に答える
0

getCacheDir を上書きしようとしましたか?

app/AppKernel.php で:

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