5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Laravelでデプロイの都度キャッシュを飛ばすのはcache:clearではだめ

Last updated at Posted at 2020-01-27

だめと書いてますがサーバーが1台の場合は特に問題ないと思います。
また、Blue-GreenDeployにおいてもあまり気にする必要はないかもしれません。

今回はローリングアップデートでデプロイした際にphp artisan cache:clearで駄目だったのでその回避方法を紹介します。

ローリングアップデートで死ぬ

今回はサーバー(インスタンス)が2台あり、それぞれをローリングアップデートでデプロイしているケースです。
1台目のデプロイ時にphp artisan cache:clearでキャッシュを消していました。
このとき、2台目のまだリリースが完了していないアプリケーションにリクエストが流れ、そのキャッシュが作られたことにより、1台目のアプリケーションでキャッシュから取得したデータがロジック変更によりエラーになってしまいました。

ではどうしたらよかったか。

違うキャッシュキーを参照するようにする

1台目と2台目でキャッシュキーが異なれば1台目ではキャッシュが取得できないので新たに取得処理・キャッシュ生成が行われます。また、そもそもキャッシュをクリアする必要すら不要になります。
デプロイする都度、その世代のキャッシュキーを生成することで問題は解消されます。

Laravelのconfig/cache.phpにはprefixという項目があり、CACHE_PREFIXという環境変数で変更できます。

cache.php
'prefix' => env(
    'CACHE_PREFIX',
    str_slug(env('APP_NAME', 'laravel'), '_') . '_cache'
),

※CACHE_PREFIXはキャッシュをfilearray指定時には利用されません。

デプロイの都度一意のキャッシュキーを生成

今回はCircleCIでの例です。

echo -n "CACHE_PREFIX=" > .env | echo $CIRCLE_SHA1 | cut -c -10 >> .env

CircleCIでは$CIRCLE_SHA1で最終コミットのハッシュが取得できます。これを利用し、この先頭から10桁を.envに書き出しました。
これでデプロイする都度キャッシュキーはリフレッシュされます。

同じことでお困りの方がいたら参考にどうぞ。

追記

DBのキャッシュとセッションキャッシュが両方消えて困った!という方は次の方法をご検討ください。

まずはmemcachedの設定をDB向けとセッション向けで分離します。

config/cache.php
'db_memcached' => [
  // 内容はmemcached項目を参照
],
'session_memcached' => [
  // 内容はmemcached項目を参照
],

そして.envのDBのキャッシュドライバとセッションストアの指定を変更

.env
CACHE_DRIVER=db_memcached
SESSION_STORE=session_memcached

これでDBのキャッシュとセッションのキャッシュを分離できました。
続いてdb_memcachedのみprefixを与えます。

config/cache.php
'db_memcached' => [
  // 内容はmemcached項目を参照
  'options' => [
    Memcached::OPT_PREFIX_KEY => env('DB_CACHE_PREFIX', '')
  ]
],

あとは先程のデプロイ手順同様にDB_CACHE_PREFIXを生成してあげることでデプロイ毎にDBキャッシュだけ更新されます。
めでたしめでたし。

5
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?