九保すこひ@フリーランスエンジニア|累計300万PVのブログ運営中
さてさて、この間初めて本格的に 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
だけでなくPython
や Node.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になってしまう可能性があります。
覚えとけよ、僕・・・(汗)