危険!Laravelで「config:cache」を使う時の注意点

さてさて、この間初めて本格的に Google Cloud サービスと連携をした開発をする機会をいただきました。

Google APIを使ってある処理をする機能を作ったのですが、やはりクラウドの先で機械学習などを利用するという形は開発者としては面白いので終始ウキウキで開発をすることになりました(ご依頼主さんにはいつも感謝です!)

ただ、その開発の中でせっかくだから少しでもサイトを高速化しようとしてひとつ落とし穴に落ちてしまったので、みなさんも同じ状況に陥らないように情報を共有をしておきたいと思います。

ぜひ皆さんのお役に立てますと幸いです。


「意外と穴は結構深かった・・・」

環境:Laravel 5.4

状況説明

Google API のために設定をしました

まず冒頭部分でも説明したとおり、Google Cloud API を使うために認証キーになる json ファイルを取得してLaravelへ保存しました。

そして、どこからでもデータが取得できるように以下2つの情報を.envファイルに書き込みました。

  • GOOGLE_CLOUD_PROJECT ・・・ プロジェクト番号
  • GOOGLE_APPLICATION_CREDENTIALS ・・・ すぐ上で取得した json ファイルへのパス

そして、Google API へアクセスして開発を進めることに。

ここでは紆余曲折はあったものの、特に問題はなく開発は完了!

開発者として、より良いものを提供したいと思いサイトの高速化を実行

キャッシュ・ドライバーをapcへ変更して(詳しくはhttp://永久保存版!Laravel・Cacheの使い方大全をご覧ください)今回問題となった以下のコマンドを実行しました。

php artisan config:cache

このコマンドで何ができるかというと、Laravelにはconfigというフォルダがあって、この中には各種設定ファイルが格納されています。そして、この部分はconfig:cacheでキャッシュを作っていなければ、アクセスするたびに毎回全ファイルを読み込んでいます。

しかし、そうなってしまうとやはり表示に時間がかかってしまうので上のコマンドを使うというわけです。

ということで、私も高速化をすべく喜び勇んでこもコマンドを実行しました。

するとGoogle APIにアクセスができなくなってしまった!?

はじめは、config:cacheが原因だとはわかっていなかったのですが、エラーをみるとどうやら Google API の認証に失敗しているようでした。

はて?

認証ならすぐさっきまで成功していたのに、何が原因だろう??
そして、色々とチェックしてみると・・・

原因は env() だった!

結論から言うと、以下が原因でした。

env() は config:cache してしまうと null を返すようになる (T^T)

そうです。
つまり、一番最初に設定した.envファイルからデータを取得することができなくなってしまうんですね。

ただ注意が必要なのは、今回私は Google API のためにenv()からデータ取得するコードは書いてはいないんですね。

では、どこかで呼ばれている・・・・一体どこで???

Google のパッケージ内だった

Google は自社のAPIをより使ってもらうために PHP だけでなくPythonNode.js などのコードをパッケージ化してくれているのですが、実はこの中で GOOGLE_APPLICATION_CREDENTIALS が呼ばれていたんですね。

Googleが用意したサンプル・コードを利用していたので認証部分のコードを書いていないことに気がついていませんでした。

というか、わざわざconfigファイルの中でenv()が呼ばれているのはこういう理由だったわけですね。ずっとLaravelを使っているのにホントうっかりしていました。

では、単純にconfigファイルの中にいれればいいのか??

config:cache を使ってしまうと .envにアクセスができなくなってしまうため、例えば config/app.php などに登録してみることにしました。

でもこれではうまくいきません。なぜなら、Googleのパッケージはconfig()を実行しているわけではないからです。

そう、つまりGOOGLE_APPLICATION_CREDENTIALSから直接データを取得する場合はconfig:cacheは使わない、もしくはコンフィグに登録したら各自認証をしなければいけないという結果になりました。

うーむ、こんな落とし穴があろうとは・・・

・・・ということで、みなさんもPHPでGoogle API を使う場合はくれぐれも気をつけてください!

ちなみに

過去の記事を検索してみたら、全120種類!Laravel5.6ヘルパー関数実例というページでenv()の説明をしているのですが、そこには自分自身でこう書いていました。

ただし、artisanコマンドの「config:cache」を使ってしまうと「.env」が読み込めず内容がnullになってしまう可能性があります。

覚えとけよ、僕・・・(汗)