CakePHP3をHerokuでデプロイしたい③
前回の続きの記事となります。
(前回の記事)
CakePHP3をHerokuでデプロイしたい② - 29歳からエンジニア目指すブログ
以下のQiitaを参考にしてCakePHP3をHerokuでデプロイしていました。
しかしデプロイ後にデバッグすると、Memcachedという分散キャッシュサーバが機能してないと怒られてしまいます。
Memcachedを拡張しないといけないみたいでした。
その方法を見ていきます。
- Herokuでのデプロイ後のエラー
- Memcachedをcomposerで入れる
- ところがcomposer updateが通らない
- ローカル環境にPHPのmemcached拡張機能をインストールしていく
- ①ターミナルで「pecl bundle memcached」と打つ
- ②ターミナルで「cd memcached」と打つ
- ③ターミナルで「phpize」と打つ
- ④ターミナルで「brew install libmemcached zlib」と打つ
- ⑤ターミナルで「brew list zlib」と打つ
- ⑥ターミナルで「./configure --with-zlib-dir=/usr/local/Cellar/zlib/1.2.11/」と打つ
- ⑦ターミナルで「make」と打つ
- ⑧ターミナルで「make install」と打つ
- ⑨該当のphp.iniファイルに拡張子行を追加する
- ⑩ターミナルで「heroku restart」
- 最後にチェック、ターミナルで「php -m」
- 再びcomposer update
- ところが「1 is not a valid serializer engine for 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拡張機能が必要ですが、あなたのシステムにはありません。PHPのmemcached拡張機能をインストールするか、有効にしてください。」と出ます。
ローカル環境にPHPのmemcached拡張機能をインストールしていく
それではやっていきましょう。
How to install memcached module for php@7.1 on MacOS High Sierra? - Stack Overflow
このスタックオーバーフローに救われました。
英語ですが、2本指クリックで「日本語に翻訳」をすれば全然読めます。
※homebrewが入っていない方は入れておいてください。
④ターミナルで「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 // この行を追加
再び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の本番画面がエラーなしになるはずです。
上記のQiitaの記事はとても良いのですが、ちらほらこの通りに設定してMemcachedで詰まってteratailで聞いている方がいたので、記録に残しました。
お役に立てば幸いです。
ありがとうございました。