本サイトはプロモーションが含まれています

Heroku×Laravelで Class 'Redis' not found エラーが出た時の対処法

導入

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 にデプロイした際に発生するエラーの対処法を紹介しました。
このエラーはよく発生するようなので、この情報を役立ててもらえたら嬉しいです。