読者です 読者をやめる 読者になる 読者になる

AWS + Capistrano + PHP + Opcache でデプロイが反映されない

AWSの問題かな? と思ったが違った。

以下によるとPHPのOpcacheはシンボリックリンクの切り替えではクリアされないっぽい。
http://kohkimakimoto.hatenablog.com/entry/2014/09/13/154342

なので、Capistranoでデプロイすると
ソースコードは変更されているはずなのに前と挙動が変わらない」
という現象が発生する。
どうすればいーのか?

結論から言うと、Capistranoでデプロイ後に php-fpm を reload するタスクを deploy.rb に追加しました。

namespace :deploy do

  # ここが追加した部分
  desc "clear opcache"
  task :clear_opcache do
    on roles(:web) do
      execute "/etc/init.d/php-fpm reload"
    end
  end

  after :restart, :clear_cache do
    on roles(:web), in: :groups, limit: 3, wait: 10 do
      # Here we can do anything such as:
      # within release_path do
      #   execute :rake, 'cache:clear'
      # end
    end
  end

end

# finished の後に clear_opcache を実行するように設定
after 'deploy:finished', 'deploy:clear_opcache'

これによって web というロールに紐付いたサーバ全てに reload を実行するようになる。
ロールの設定方法はググって下さい。

結構ハマった。