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

前回の続きの記事となります。

(前回の記事)

CakePHP3をHerokuでデプロイしたい② - 29歳からエンジニア目指すブログ

以下のQiitaを参考にしてCakePHP3をHerokuでデプロイしていました。

CakePHP3をHerokuで動かす設定 - Qiita

しかしデプロイ後にデバッグすると、Memcachedという分散キャッシュサーバが機能してないと怒られてしまいます。

Memcachedを拡張しないといけないみたいでした。

その方法を見ていきます。

【自分の環境】
macOS Catalina
PHP7.4.2
CakePHP3.8
MAMP5.7
Apache2.2
MySQL5.7

Herokuでのデプロイ後のエラー

デプロイ後にデバッグキットを起動させると、こんなエラーが出ています。

Warning (512): Cache engine Cake\Cache\Engine\MemcachedEngine is not properly configured. [CORE/src/Cache/Cache.php, line 178]

これは翻訳すると、「MemcachedEngine が正しく設定されていない」ということです。

Memcachedをcomposerで入れる

どうやらMemcached拡張機能をcomposerで入れればいいらしいです。

composer.jsonに以下のように書き込みます。

{
    "require": {
       ...,
        "ext-memcached": "*"
    }
}

「ext-memcached」は「Memcached拡張機能」という意味ですね。

これでcomposer updateしていきます。

ところがcomposer updateが通らない

通らないですね。

ターミナルで以下のような注意をされます。

Root composer.json requires PHP extension ext-memcached * but it is missing from your system. Install or enable PHP's memcached extension.

翻訳すると「Root composer.jsonにはPHPのext-memcached拡張機能が必要ですが、あなたのシステムにはありません。PHPmemcached拡張機能をインストールするか、有効にしてください。」と出ます。

自分の解釈では、「ローカル環境にPHPmemcached拡張機能をインストールしないとダメ」ということです。

ローカル環境にPHPmemcached拡張機能をインストールしていく

それではやっていきましょう。

How to install memcached module for php@7.1 on MacOS High Sierra? - Stack Overflow

このスタックオーバーフローに救われました。

英語ですが、2本指クリックで「日本語に翻訳」をすれば全然読めます。

※homebrewが入っていない方は入れておいてください。

①ターミナルで「pecl bundle memcached」と打つ

memcachedディレクトリを作りたい場所で行います。

自分はよくわからずアプリのルートディレクトリで行っていました。

動いているのでよしとします。

②ターミナルで「cd memcached」と打つ

出力したディレクトリ(memcached)に移動します。

③ターミナルで「phpize」と打つ

ググったのですが、正直、意味はよくわかってません。

たくさん記事があるので、ググってみてください。

④ターミナルで「brew install libmemcached zlib」と打つ

libmemcachedとzlibの2つがインストールされます。

すでにインストールされていたら、「インストールされてるよ」と言われます。

⑤ターミナルで「brew list zlib」と打つ

zlibディレクトリを取得します。

以下のかんじで出てきます。

/usr/local/Cellar/zlib/1.2.11/include/ (2 files)
/usr/local/Cellar/zlib/1.2.11/lib/libz.1.2.11.dylib
/usr/local/Cellar/zlib/1.2.11/lib/pkgconfig/zlib.pc
/usr/local/Cellar/zlib/1.2.11/lib/ (3 other files)
/usr/local/Cellar/zlib/1.2.11/share/man/man3/zlib.3

これは「/usr/local/Cellar/zlib/1.2.11」が共通していますね。

これを次に使います。

⑥ターミナルで「./configure --with-zlib-dir=/usr/local/Cellar/zlib/1.2.11/」と打つ

zlibパスを前のコマンドのパスに置き換えてます。

最後の方のパスやバージョンが違ったら揃えてください。

⑦ターミナルで「make」と打つ

何かが作られます。

⑧ターミナルで「make install」と打つ

何かがインストールされます。

⑨該当のphp.iniファイルに拡張子行を追加する

該当のphp.iniファイルがわからなかったら、ターミナルに「php -i」と打って調べてください。

以下の行を探します。

Configuration File (php.ini) Path => /usr/local/etc/php/7.3

パスは自分のものなので、それぞれの環境のものが出ると思います。

そのphp.iniを開いて、以下のように書き加えます。

;;;;;;;;;;;;;;;;;;;;;;
; Dynamic Extensions ;
;;;;;;;;;;;;;;;;;;;;;;

(中略)

[memcached] // この行を追加
extension=memcached.so // この行を追加
⑩ターミナルで「heroku restart」

そしてターミナルで「heroku restart」(php.iniの変更を反映させる)してください。

これで反映されると思います。

最後にチェック、ターミナルで「php -m」

php -m」して、リストに「memcached」があれば行けてます。

これでcomposer updateができるようになります。

再びcomposer update

composer.jsonに「"ext-memcached": "*"」を書き込んだら、composer updateします。

上記をしっかりやっていれば、これで行けると思います。

ところが「1 is not a valid serializer engine for Memcached

本番画面を見ると、「1 is not a valid serializer engine for Memcached」というエラーが出るかもしれません。

またエラーか…と思いますが、app.phpで以下の記述をコメントアウトすれば大丈夫です。

'serialize' => true, // コメントアウトする行

これをコメントアウトしてください。

ちなみにapp.phpに複数(3つか4つ)あるので、全部コメントアウトしてください。

よくわかってないですが、これを消せばエラーがなくなります。

終わりに

以上となります。

だいぶ長くなりましたが、これでHerokuの本番画面がエラーなしになるはずです。

CakePHP3をHerokuで動かす設定 - Qiita

上記のQiitaの記事はとても良いのですが、ちらほらこの通りに設定してMemcachedで詰まってteratailで聞いている方がいたので、記録に残しました。

お役に立てば幸いです。

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