PHPでの環境情報の管理はphp-dotenvがオススメ
2016年 12月 09日
このエントリーは、エキサイト Advent Calendar 2016 の 12/10 の記事です。
エキサイトとしては初のAdvent Calendar参戦です。
Advent Calenderもそろそろ折り返し地点
お子さんのいるご家庭ではそろそろクリスマスの準備をし始めているところも多いハズ。
もし「今年のクリスマスはどうしよう…」なんて思っている方は
ママ・パパへの情報がぎっしり詰まった
ウーマンエキサイトのクリスマス特集も是非御覧ください!
Webサーバの環境設定の管理
MySQLのユーザー名・パスワードや、外部APIの利用キーなど
開発環境と本番環境で微妙に違う情報って色々あるかと思います。
よくあるのは 定数クラス群を用意して、サーバーホスト名で使い分けたり…など
使っているフレームワークや管理手法によって様々だと思います。
今回、ご紹介するのはそれらをいい感じに解決してくれる
.env
という考え方です。
dotenvとは
.env(dotenv)
はもともとRuby界隈で考えられた仕組みで.env
というファイルに環境情報を記述して適宜ロードして利用するという仕組みです。
今回はエキサイトでも使われているBEAR.Sundayのクイックチュートリアルにも登場する
php-dotenvでの使い方をご紹介します。
php-dotenv
composer install
composerのパッケージ名は josegonzalez/dotenv
なので
以下のようなコードを composer.json
に追加します。
{ "require": { "josegonzalez/dotenv": "^2.0" }}
追加が終わったら composer install
します。
.envの追加
環境情報を載せる .env
ファイルを追加します。
今回は例としてMYSQLのホスト名、ID、パスワードを記述します。
MYSQL_USER=mysql_user MYSQL_PASS=passowrd MYSQL_HOST=mysqlserver MYSQL_DBNAME=db
.envを利用する
composerで読み込んだものを利用するだけです。
今回はdb情報を読み取って、selectをする例をご紹介します。
<?php require_once __DIR__ . "/vendor/autoload.php"; use josegonzalez\Dotenv\Loader as Dotenv; $appDir = __DIR__; Dotenv::load([ 'filepath' => $appDir . '/.env', 'toEnv' => true ]); $mysqlUser = $_ENV['MYSQL_USER']; $mysqlPass = $_ENV['MYSQL_PASS']; $mysqlHost = $_ENV['MYSQL_HOST']; $mysqlDbName = $_ENV['MYSQL_DBNAME']; $mysqlDsnFormat = "mysql:host=%s;dbname=%s;charset=UTF8"; $dsn = sprintf($mysqlDsnFormat, $mysqlHost, $mysqlDbName); $dbh = new PDO($dsn, $mysqlUser, $mysqlPass); $sql = 'SELECT * from users'; $result = $dbh->query($sql); foreach ($result as $row) { echo $row['id']; } $dbh = null;
dotenvを使うメリット
設定ファイルとして.env
というファイル名で共通管理するというのが
この考え方の中心となります。こうすることにより得られるメリットは大きく2つあります。
環境ごとの呼び出しコードの一本化
「.env
に環境情報がある」とすることで
「開発環境だったら dev_conf.yml
を使って、 本番だったら prod_conf.yml
を使って〜」
のような環境毎にファイルの読み先を変えなければいけない、という懸念がなくなります。
もしステージ環境や、テスト環境など違う環境が増えることになっても
いちいちその環境ファイルの読み込み分岐処理を書かずに済みます。
人によって実装がバラバラになりがちな環境依存の文字列の定義が
dotenv
を使おう!という意識合わせをすることで一本化できます。
もともと何かしら使っていたのであれば、集約する道標ともなるので便利かと思います。
環境毎の情報をプロダクトコードと分けての管理が可能
環境ごとの情報をファイル単位、かつ抜き出して管理することができるので
実際のプロダクトコードのリポジトリに環境情報をコミットせずに別管理にできます。
そのため、デプロイツールのリポジトリに .env
を用意して
デプロイのときにツールから実際の環境に配置するようにしてあげれば
プロダクトコード側は環境用のファイル管理を考える事なく振る舞うことができます。
想定例を図にしてみました
このようにすることで、機密情報がプロダクトコードから隔離して管理できるので
「publicなリポジトリにうっかりコミットしていけない情報を載せてしまった!」
なんてことも少なくなります。
また、メリットのある他の例としては
コードの改修を外に依頼したいときなど、秘匿情報を見られたくない人に
コードを共有しなければいけない場合などには
.env
で管理していれば「本番環境のパスワードは消してから渡さないといけない…」というような事態が避けられ
スムーズに共有することができます。
dotenvは共通認識を取りやすい仕組みなので
是非活用してみてください!
まだまだ続くAdvent Calender、明日もお楽しみに!