導入
Laravel と Redis を使ったシステムを作った際、ローカル環境では問題なく動いたのですが、Heroku にデプロイした際、Class 'Redis' not found
エラーが発生しました。
日本語でこの問題の対処法に触れた記事がなかったので、まとめます。
スポンサードリンク
前提条件
まず、Laravel で Redis を使うためには、以下のどちらかを行う必要があります。
(https://readouble.com/laravel/8.x/ja/redis.html)
- PECL で phpredis をインストール
- composer で predis をインストール
phpredis と predis の違いは速度で、phpredis のほうが高速に動作します。
predis は一時開発が止まっていたため、非推奨になっていましたが、開発が再開されたようです。
ただ、公式のドキュメントでは phpredis を使った説明となっています。
Laravel Sail を使うとデフォルトで Redis が使えるのですが、これは phpredis を使っています。
今回は phpredis を使い、Heroku にデプロイするものとします。
predis の場合は、Heroku が composer.lock に基づき自動でインストールしますが、phpredis の場合は何もしなければ Class 'Redis' not found
エラーが発生します。
対処法
Heroku 上で phpredis を使えるようにするためには、サードパーティー製の拡張 ext-redis
をインストールする必要があるようです。
PHP のバージョンによってインストールする ext-redis
のバージョンが異なり、こちらのページによると、
- PHP7.2 以前は
3.x
- PHP7.3 は
4.x
- PHP7.4 以降は
5.x
を使えばよいそうです。
具体的なインストール方法は、composer.json の”require”内の括弧に、以下の一行を追加します。
"require": { "ext-redis": "(インストールしたいバージョン)" // 追加する1行},
例えば、PHP8.1 を使っている場合は以下のようになります。
"require": { "ext-redis": "5.*"},
その後、変更を保存し、composer.lock を更 新するため以下のコマンドを入力し実行します。
composer update --ignore-platform-reqs
最後に、この変更を git add & commit し、Heroku に push すると、Heroku に ext-redis
がインストールされます。
これでエラーが出なくなるはずです。
おまけ
Heroku Redis を使う際は、config/database.php
に以下の記述を先頭に追加しておくとよさそうです。
これでメンテナンスによって Redis の URL が変わった場合でも、Redis が動作し続けます。
<?php
use Illuminate\Support\Str;
// 追加ここからif (getenv('REDIS_URL')) { $url = parse_url(getenv('REDIS_URL')); putenv('REDIS_HOST=' . $url['host']); putenv('REDIS_PORT=' . $url['port']); putenv('REDIS_PASSWORD=' . $url['pass']);}// 追加ここまで
return [
スポンサードリンク
終わりに
今回は Laravel と Redis を使ったシステムを Heroku にデプロイした際に発生するエラーの対処法を紹介しました。
このエラーはよく発生するようなので、この情報を役立ててもらえたら嬉しいです。