CakePHP3をHerokuでデプロイしたい②

CakePHP3をHerokuでデプロイしたい②です。

前回の「CakePHP3をHerokuでデプロイしたい①」の続きになります。

今回はHeroku用のapp.phpの設定についてです。

こちらのQiitaが参考になりました。

CakePHP3をHerokuで動かす設定 - 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にあたる部分をやっていますね。

PHPで作ったWebサービスをHerokuでデプロイするまでの手順書 - Qiita

SALTの設定

途中でSALTが出てきています。

これはご自身でターミナルで以下のコマンドを打ち、設定してください。

$ heroku config:add SALT="1234567890987654321"

「1234567890987654321」は適当な文字列なので、ご自身の考えた文字列に変えてください。

キャッシュの設定

キャッシュはデフォルトだとローカルファイルを使うようになっているので、Memcachedを使うようにします。

Memcachedの導入がなかなか難しいので、次回の記事「CakePHP3をHerokuでデプロイしたい③」で述べます。

セッションの設定

デフォルトだとローカルファイルになっているので、先に設定したMemcachedを使うようにします。

ログの設定

デフォルトだとローカルファイルにログを出力するようになっているので、標準出力に出力するように変更します。

ログエンジンにConsoleLogを使います。

ファイルログで見たければ、元々の設定でも大丈夫です。

Herokuでのログコンソールの見方、ログファイルの出力は後日記事にします。

終わりに

とりあえずは以上となります。

まだキャッシュが設定できてないですが、一応これでデプロイはいけます。

PHPで作ったWebサービスをHerokuでデプロイするまでの手順書 - Qiita

今回はこちらのQiitaで言う手順11はクリアしたので、デプロイまで行っちゃってください。

キャッシュ(Memcached)の導入については、次回「CakePHP3をHerokuでデプロイしたい③」で話します。

ありがとうございました。