保存版!Laravelの.envでできること大全

さてさて、前回の永久保存版!Laravel・Cacheの使い方大全ではキャッシュ方式の設定に.envを使って切り替えをしてみました。

ただ、この.envファイル。よく使うとは言っても「じゃあ、全項目の意味を知ってる??」と聞かれると結構知らない項目もあったりするのではないでしょうか。

そこで!

今回は、Laravelの設定の基本となる.envが一体どんな意味をもっているのかをまとめることにしました。今回も保存版的な位置づけで記事を書いていますので、ぜひ備忘録として使ってください。

※実行環境はLaravel 5.7です。

APP_NAME: サイト名

APP_NAMEは開発しているサイトの名前ですが、この項目は以下のようにconfig()を使ったサイト名の取得に影響があります。

echo config('app.name'); // APP_NAMEが反映される

また、実はこのAPP_NAMEはキャッシュ・キーやセッション名として利用されています。

これは、例えばキャッシュ・システムにapcmemcachedを使う場合、他のサイトでも同じ名前のキーを使ってしまうと、一体どちらで使うべきデータが分からなくなってしまうからです。(つまり、共通のキャッシュ・システムを共有するからです)

そのため、一意なキーを作成するためにサイト名が利用されています。

ちなみにAPP_NAMEが利用されているファイルは、以下の2つです。

  • /config/cache.php
  • /config/session.php

APP_ENV: 環境名

開発しているサイトの実行環境を指定する項目です。
そのため、指定する項目としては以下のようなものが挙げられるでしょう。

  • local ・・・ ローカル(開発)
  • stating ・・・ ステージング
  • production ・・・ 本番

また、APP_ENVで指定した環境は以下のようなコードに影響します。

$env = app()->environment(); // localなど
if(app()->isLocal()) {

    echo 'ローカル環境です。';

}

そのため、開発環境だけで利用するSeederなどで使うといいかもしれません。

APP_KEY: 暗号化に使われるキー

APP_KEYの値は、Laravelがインストールされると各自ランダムで作成されるため、このキーは(ほぼ)完全に世界でひとつだけしか存在しないことになります。そして、このキーは暗号化に関連する以下の場面で利用されています。

  • encrypt(), decrypt()など暗号化/復号する
  • パスワード・リマインダーで使われるトークンをつくる

また、この.envのキーを変更したい場合は以下のコマンドを実行すると自動的に変更することができます。

php artisan key:generate

※ ただし気をつけないといけないのは、前のキーで暗号化したデータを新しいキーでは復号することはできないということです。つまり、キャッシュされた暗号化データがある場合は特に注意が必要です。

APP_DEBUG: デバッグの表示設定

APP_DEBUGは、プログラムを実行したときに発生するエラーを表示するかどうかを設定する場所になります。

そのため、設定する値はtruefalseになります。(デフォルトはtrue

実際の例を見てみましょう。まずは、

APP_DEBUG=true

の場合です。

Laravelでサイト開発をしたことがある人なら、お馴染みのページといっていいんじゃないでしょうか。このページでは詳しいエラーの内容、エラーの場所などを教えてくれるので開発には必須といっていいでしょう。

では、逆に

APP_DEBUG=false

の場合はどうなるでしょう??

今度はエラーの内容は全く表示されず、砂漠の画像が表示されました。

ちなみに、ローカル環境では常にAPP_DEBUGtrueで問題ないですが、誰もがアクセスできる本番環境ではfalseにしておくことを強くおすすめします。

なぜなら、エラー情報には不正アクセスを試みる人たちにとって有益な情報がたくさん含まれているからです。

例えば、エラー情報には以下のような情報が含まれています。

そうです。
データベースのユーザー名や、パスワードが含まれています。

また、Laravelとは関係ない話ですが、HTTPヘッダー情報に含まれる「Server情報(apacheやnginxのバージョン情報)」も消して置いた方がよりセキュリティに強いといえます。バージョンがばれると、すでに広く知られているバグを利用して不正アクセスされやすくなるためです。

APP_URL: サイトのURL

APP_URLは以下のようにサイトのURLに関連する部分で利用されています。

echo config('app.url'); // トップページのURL
echo config('filesystems.disks.public.url'); // *****/storage

なお、ヘルパー関数のurl()APP_URLの情報を使っていそうですが、実際には$_SERVER['host']の情報が使われています。

LOG_CHANNEL: ログ情報の設定

Laravelのログ設定は、stackとなっていて、複数のログが有効になるようになっています。(ただし、stackの中身を設定する部分では、基本となるsingleがひとつだけ指定されているので、実際にはデフォルトで利用されるログはひとつとなっています)

また、LOG_CHANNELで指定できるのは、以下の8タイプになっています。

  • stack ・・・ 複数のログを設定可能にする(デフォルト値)
  • single ・・・ ひとつのファイルにログ情報を追加して書き込んでいく形式
  • daily ・・・ 日ごとにログファイルを作成する形式。
  • slack ・・・ slackにログ出力する形式。Laravel 5.6での解説はこちら
  • monolog ・・・ Monologを使ったログ方式
  • syslog ・・・ システムのログに出力 ※
  • errorlog ・・・ システムのログに出力 ※
  • custom ・・・ 独自のログ出力

※ 例えば、nginxの場合だと/var/log/nginx/access.log/var/log/nginx/error.log

DB_*****: データベースへの接続情報

データベースへの接続情報は以下の6つです。

  • DB_CONNECTION
  • DB_HOST
  • DB_PORT
  • DB_DATABASE
  • DB_USERNAME
  • DB_PASSWORD

ひとつずつ見ていきましょう。

DB_CONNECTION

利用するデータベースの種類を指定します。この情報は、config/database.phpconnections内から選ぶことになり、デフォルトでは以下の4つが利用可能になっています。

  • mysql ・・・ MySQL
  • pgsql ・・・ PostgreSQL
  • sqlite ・・・ SQLite
  • sqlsrv ・・・ SQL Server

※ もしMongoDBを使いたい場合はlaravel-mongodbというパッケージを利用するといいでしょう。

DB_HOST

データベースのホストです。通常はローカルの127.0.0.1になることが多いでしょう。またローカルホストの場合は、localhostとしても接続できます。

DB_PORT

データベースが利用するポート番号です。
MySQLの場合は通常3306が利用されます。


DB_DATABASE

利用するデータベース名です。
例えば、laravel57などのようにサイト名に関連した名前が多くなるでしょう。

DB_USERNAME

利用するデータベース名にアクセスするユーザー名です。
ローカル環境ではrootなどが多いのかもしれません。

DB_PASSWORD

利用するデータベース名にアクセスするパスワードです。

※ ちなみに、DB_CONNECTION以外の設定が利用されるのは、MySQLPostgreSQLSQL Serverの3つです。(SQLiteはデータをファイルで管理するため必要ありません)

BROADCAST_DRIVER: ブロードキャスト設定

ブロードキャスト(Laravelのイベントをブラウザに通知する機能、要はチャットを想像してください)の種類を設定する項目です。

利用できる種類は、以下の4つです。

  • pusher ・・・ Pusherを利用する場合
  • redis
  • log
  • null

CACHE_DRIVER: キャッシュ方式

利用するキャッシュの方式を設定する項目です。
詳しくは、永久保存版!Laravel・Cacheの使い方大全の「様々なキャッシュ方式を使いたい」をご覧ください。

QUEUE_CONNECTION: キュー方式

利用するキューの方式を設定する項目です。
設定できるのは、以下の5つです。

  • sync
  • database
  • beanstalkd ・・・ Beanstalkを利用する方式
  • sqs ・・・ Amazon SQSを利用する方式
  • redis

SESSION_*****: セッション関連

SESSION_DRIVER

利用するセッションの方式を設定する項目です。指定できるのは以下の7つ。

  • file
  • cookie
  • database
  • apc
  • memcached
  • redis
  • array

SESSION_LIFETIME

セッションの継続時間(分)です。
デフォルトでは120分(=2時間)になっています。

ただし、php.inisession.gc_maxlifetimesession.cookie_lifetimeの値がこれよりも短い場合は、そちらが優先されます注意してください。

REDIS_*****: Redis関連

REDIS_HOST, REDIS_PASSWORD, REDIS_PORT

redisを利用する場合の接続情報です。

MAIL_*****: メール関連

MAIL_DRIVER

利用するメール送信方式を指定する項目です。
指定できるのは以下の8つです。

  • smtp
  • sendmail
  • mailgun ・・・ mailgunを利用する方式
  • mandrill ・・・ mandrillを利用する方式 ※1
  • ses ・・・ Amazon SESを利用する方式
  • sparkpost ・・・ SparkPostを利用する方式
  • log ・・・ 実際にはメール送信せずログファイルに出力する方式
  • array

※1 mandrillはLaravel 5.3からは公式ドキュメントから削除されていますが、config/mail.phpでは設定が可能になっています。

MAIL_HOST, MAIL_PORT, MAIL_USERNAME, MAIL_PASSWORD

メールサーバーへの接続情報です。

MAIL_ENCRYPTION

tslsslなどのメールを暗号化するプロトコルを指定します。

PUSHER_*****, MIX_PUSHER_*****: PUSHER設定

Pusherの接続情報を設定する項目です。

.envには初期状態で書かれていない項目

Amazon SQSの設定

SQS_KEY=***
SQS_SECRET=***
SQS_PREFIX=***
SQS_QUEUE=***
SQS_REGION=***

Amazon SQSの設定をする項目で、config/queue.phpの中に記述されています。

Amazon SESの設定

SES_KEY=***
SES_SECRET=***
SES_REGION=***

Amazon SESの設定をする項目で、config/services.phpの中に記述されています。

mailgunの設定

MAILGUN_DOMAIN=***
MAILGUN_SECRET=***

mailgunの設定項目で、config/services.phpの中で利用されています。

SparkPostの設定

SPARKPOST_SECRET=***

SparkPostの設定項目で、config/services.phpの中に記述されています。

stripeの設定

STRIPE_KEY=***
STRIPE_SECRET=***

stripe(オンライン決済サービス)の設定項目で、config/services.phpの中に記述されています。

memcachedの設定

MEMCACHED_PERSISTENT_ID=***
MEMCACHED_USERNAME=***
MEMCACHED_PASSWORD=***
MEMCACHED_HOST=***
MEMCACHED_PORT=*** 

memcachedの設定項目で、config/cache.php内で利用されています。

キャッシュ名のプリフィックス

CACHE_PREFIX=***

キャッシュ名が重複しないためのプリフィックス。
詳しくは、APP_NAMEを参照してください。

Unixドメインソケットの設定

DB_SOCKET=***

MySQLのUnixドメインソケットを利用する場合に使う設定で、config/database.phpで利用されています。

AWSの設定

AWS_ACCESS_KEY_ID=***
AWS_SECRET_ACCESS_KEY=***
AWS_DEFAULT_REGION=***
AWS_BUCKET=***
AWS_URL=***

ファイルシステムで、s3を利用する場合に使われる接続情報です。

暗号計算する数値

BCRYPT_ROUNDS=***

PHP標準関数のpassword_hash()のオプション値costを指定する数値です。つまり、この数値が多ければより強力な暗号が作成できますが、その分コンピュータへの負荷が大きくなります。

slackのウェブフック

LOG_SLACK_WEBHOOK_URL=***

slackのウェブフックURLを指定する項目です。

メール送信元と送信者名

MAIL_FROM_ADDRESS=***
MAIL_FROM_NAME=***

この値を指定しておくと、メール送信の際にfrom()を指定する必要がなくなります。

セッションDBの設定

SESSION_CONNECTION=***

セッション方式にdatabaseredisを指定した場合に使えるコネクションのためのパラメータです。

セッション・キャッシュ・ストア

SESSION_STORE=***

セッション方式にapcmemcachedを指定した場合に使えるキャッシュ・ストアのためのパラメータです。

セッション名のプリフィックス

SESSION_COOKIE=***

Cookieの名前が重複しないためのプリフィックス。
詳しくは、APP_NAMEを参照してください。

Cookieのドメイン名

SESSION_DOMAIN=***

Cookieが有効になるドメイン名を指定する項目です。

Cookieのセキュア設定

SESSION_SECURE_COOKIE=***

この設定をtrueにした場合、HTTPSで接続している場合のみセッションCookieが送信されます。デフォルトはfalse

ダウンロード

今回紹介した.envの全項目を書き込んだ.env.fullを以下からダウンロードすることができます。ぜひサイト開発に役立ててください。

.envの全項目を書き込んだ: .env.full

 

※ただし、APP_KEYはセキュアな情報なので省略しています。

おわりに

今回のまとめで特に便利だと感じたのは、メール送信情報をデフォルト指定できるMAIL_FROM_ADDRESSMAIL_FROM_NAMEですね。

個人的にこの指定方法ができることを知らなかったので、いちいちメール送信部分で、

from('test@example.com', '送信者')

と記述していました。

明示的に誰に送信できるかが分かりやすいので、一概にこの方法が悪いわけではないですが、コードをより少なくするためには有効であることは間違いないので、これからはこのテクニックを活用していこうと思います。

みなさんも何かいいテクニックが見つかれば光栄です!

ではでは。