CakePHP3をHerokuでデプロイしたい②
CakePHP3をHerokuでデプロイしたい②です。
前回の「CakePHP3をHerokuでデプロイしたい①」の続きになります。
今回はHeroku用のapp.phpの設定についてです。
こちらのQiitaが参考になりました。
とても参考になったんですが、初心者にとっては完璧ではありません。
そこを補足する形で書いていきます。
【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7
参考にしながらapp_heroku.phpの設定…の下準備
引き続き先ほどのQiitaを参考にしながら書きます。
開発環境と違って、Heroku用のapp.phpが欲しくなってきます。
そこで環境変数 CAKE_ENV=heroku が設定されている場合だけ、app.php をオーバーライドする app_heroku.php を読み込むようにします。
まずターミナルでこのようなコマンドを打ちます。
$ heroku config:add CAKE_ENV="heroku"
これで環境変数CAKE_ENVにherokuが設定されました。
これはHerokuのSettingsの中のConfigVarsで見ることができます。
またbootstrap.phpで以下を記述します。
try { Configure::config('default', new PhpConfig()); Configure::load('app', 'default', false); } catch (\Exception $e) { exit($e->getMessage() . "\n"); } /* * Load an environment local configuration file to provide overrides to your configuration. * Notice: For security reasons app_local.php will not be included in your git repo. */ if (isset($_ENV['CAKE_ENV'])) { // このif文を追加 Configure::load('app_' . $_ENV['CAKE_ENV'], 'default'); // このif文を追加 }
「このif文を追加」とあるところを追加してください。
これでCAKE_ENV=herokuだった時にだけapp_heroku.phpを読み込む設定ができました。
いよいよapp_heroku.phpの設定
次にCakePHPのconfigにapp_heroku.phpを作成します。
これは最初はapp.phpを丸々っとコピーで大丈夫です。
そこから少し書き換えていきます。
以下の部分を書き換えます。
(app_heroku.php)
use Cake\Mailer\Transport\MailTransport; $db = parse_url($_SERVER['CLEARDB_DATABASE_URL']); // この行を追加 return [ (中略) 'Security' => [ 'salt' => env('SALT'), // 書き換え ], (中略) // キャッシュに関する部分を丸っと書き換え 'Cache' => [ 'default' => [ 'className' => 'Memcached', 'prefix' => 'myapp_cake_', 'servers' => [env('MEMCACHIER_SERVERS')], 'username' => env('MEMCACHIER_USERNAME'), 'password' => env('MEMCACHIER_PASSWORD'), 'duration' => '+1440 minutes', ], 'session' => [ 'className' => 'Memcached', 'prefix' => 'myapp_cake_session_', 'servers' => [env('MEMCACHIER_SERVERS')], 'username' => env('MEMCACHIER_USERNAME'), 'password' => env('MEMCACHIER_PASSWORD'), 'duration' => '+1440 minutes', ], '_cake_core_' => [ 'className' => 'Memcached', 'prefix' => 'myapp_cake_core_', 'servers' => [env('MEMCACHIER_SERVERS')], 'username' => env('MEMCACHIER_USERNAME'), 'password' => env('MEMCACHIER_PASSWORD'), 'duration' => '+1 years', ], '_cake_model_' => [ 'className' => 'Memcached', 'prefix' => 'myapp_cake_model_', 'servers' => [env('MEMCACHIER_SERVERS')], 'username' => env('MEMCACHIER_USERNAME'), 'password' => env('MEMCACHIER_PASSWORD'), 'duration' => '+1 years', ], ], // キャッシュはここまで (中略) // ClearDB用にもろもろ書き換え(MAMP設定の名残あり) 'Datasources' => [ 'default' => [ 'className' => Connection::class, 'driver' => Mysql::class, 'persistent' => false, 'url' => env('CLEARDB_DATABASE_URL'), 'host' => $db['host'], /* * CakePHP will use the default DB port based on the driver selected * MySQL on MAMP uses port 8889, MAMP users will want to uncomment * the following line and set the port accordingly */ //'port' => '8889', /* * It is recommended to set these options through your environment or app_local.php */ 'username' => $db['user'], 'password' => $db['pass'], 'database' => substr($db['path'], 1), /* * You do not need to set this flag to use full utf-8 encoding (internal default since CakePHP 3.6). */ 'encoding' => 'utf8mb4', 'timezone' => '+09:00', 'flags' => [], 'cacheMetadata' => true, 'log' => false, /* * Set identifier quoting to true if you are using reserved words or * special characters in your table or column names. Enabling this * setting will result in queries built using the Query Builder having * identifiers quoted when creating SQL. It should be noted that this * decreases performance because each query needs to be traversed and * manipulated before being executed. */ 'quoteIdentifiers' => false, /* * During development, if using MySQL < 5.6, uncommenting the * following line could boost the speed at which schema metadata is * fetched from the database. It can also be set directly with the * mysql configuration directive 'innodb_stats_on_metadata = 0' * which is the recommended value in production environments */ //'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'], 'url' => env('DATABASE_URL', null), // 'unix_socket' => '/Applications/MAMP/tmp/mysql/mysql.sock' ], // DBはここまで (中略) // ログをファイルログからコンソールログに書き換え 'Log' => [ 'error' => [ 'className' => 'Cake\Log\Engine\ConsoleLog', 'stream' => 'php://stderr', 'levels' => ['warning', 'error', 'critical', 'alert', 'emergency'], ], // 以下を新しく追加 'debug' => [ 'className' => 'Cake\Log\Engine\ConsoleLog', 'stream' => 'php://stdout', 'levels' => ['notice', 'info'], ], // ログはここまで (中略) // セッションも書き換え 'Session' => [ 'defaults' => 'cache', 'handler' => [ 'config' => 'session' ] ], ];
ちょっと長かったですが、こんなかんじでapp_heroku.phpを書き換えます。
いろいろ新出単語が出てきましたが、とりあえずはこのまま設定してみてください。
DB設定
まずClearDBのURLが出てきています。
これは前回のQiitaを踏んでいれば、勝手にClearDBの環境変数ができているので、大丈夫かと思います。
これを利用して、Datasourcesでもろもろ設定しています。
以下の記事の手順11にあたる部分をやっていますね。
SALTの設定
途中でSALTが出てきています。
これはご自身でターミナルで以下のコマンドを打ち、設定してください。
$ heroku config:add SALT="1234567890987654321"
「1234567890987654321」は適当な文字列なので、ご自身の考えた文字列に変えてください。
キャッシュの設定
キャッシュはデフォルトだとローカルファイルを使うようになっているので、Memcachedを使うようにします。
Memcachedの導入がなかなか難しいので、次回の記事「CakePHP3をHerokuでデプロイしたい③」で述べます。
セッションの設定
デフォルトだとローカルファイルになっているので、先に設定したMemcachedを使うようにします。
ログの設定
デフォルトだとローカルファイルにログを出力するようになっているので、標準出力に出力するように変更します。
ログエンジンにConsoleLogを使います。
ファイルログで見たければ、元々の設定でも大丈夫です。
Herokuでのログコンソールの見方、ログファイルの出力は後日記事にします。
終わりに
とりあえずは以上となります。
まだキャッシュが設定できてないですが、一応これでデプロイはいけます。
PHPで作ったWebサービスをHerokuでデプロイするまでの手順書 - Qiita
今回はこちらのQiitaで言う手順11はクリアしたので、デプロイまで行っちゃってください。
キャッシュ(Memcached)の導入については、次回「CakePHP3をHerokuでデプロイしたい③」で話します。
ありがとうございました。