PHPでの環境情報の管理はphp-dotenvがオススメ

このエントリーは、エキサイト Advent Calendar 2016 の 12/10 の記事です。
エキサイトとしては初のAdvent Calendar参戦です。

Advent Calenderもそろそろ折り返し地点
お子さんのいるご家庭ではそろそろクリスマスの準備をし始めているところも多いハズ。
もし「今年のクリスマスはどうしよう…」なんて思っている方は
ママ・パパへの情報がぎっしり詰まった
ウーマンエキサイトのクリスマス特集も是非御覧ください!


はじめまして!ウーマンエキサイトのエンジニア、takadaです。
折り返し地点も近いということでちょっと箸休め的なトピックとして
PHPでの環境設定情報の管理を楽にするphp-dotenvをご紹介します。

Webサーバの環境設定の管理

MySQLのユーザー名・パスワードや、外部APIの利用キーなど
開発環境と本番環境で微妙に違う情報って色々あるかと思います。
よくあるのは 定数クラス群を用意して、サーバーホスト名で使い分けたり…など
使っているフレームワークや管理手法によって様々だと思います。
今回、ご紹介するのはそれらをいい感じに解決してくれる
.env という考え方です。

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 を用意して
デプロイのときにツールから実際の環境に配置するようにしてあげれば
プロダクトコード側は環境用のファイル管理を考える事なく振る舞うことができます。

想定例を図にしてみました

f0364156_13144019.png

このようにすることで、機密情報がプロダクトコードから隔離して管理できるので
「publicなリポジトリにうっかりコミットしていけない情報を載せてしまった!」
なんてことも少なくなります。

また、メリットのある他の例としては
コードの改修を外に依頼したいときなど、秘匿情報を見られたくない人に
コードを共有しなければいけない場合などには .env で管理していれば
「本番環境のパスワードは消してから渡さないといけない…」というような事態が避けられ
スムーズに共有することができます。

dotenvは共通認識を取りやすい仕組みなので
是非活用してみてください!

まだまだ続くAdvent Calender、明日もお楽しみに!

エンジニア募集

エキサイトではエンジニアとして一緒に働いてくださる方を
新卒採用中途採用で募集しています。
詳しくは、こちらの採用情報ページをご覧ください。


[PR]
by ex-engineer | 2016-12-09 14:30