はじめに
今回の記事では、PHP dotenv を使用して.env
ファイルを読み込む方法についてまとめていきます。
開発環境
- Docker: version 23.0.6, build ef23cbc
- PHP: version 8.1.9
- Composer: version 2.5.7
なお、これ以降の作業は PHP がインストールされた Dokcer コンテナ内での作業となります。
PHP Dotenv のインストール
以下のコマンドを実行してインストールします。
$ composer require vlucas/phpdotenv
composer.json
でインストールされたバージョンを確認します。
{
"require": {
"vlucas/phpdotenv": "^5.5"
}
}
.env ファイルの配置
プロジェクトのルートディレクトリに.env
ファイルを配置して、データベースへの接続情報など読み込みたい値を記述します。
今回.env
ファイルの内容は同じ階層にあるindex.php
で読み込むものとします。
├── public # プロジェクトルート
│ ├── index.php # .envを読み込むファイル
│ ├── .env
│ ├── .gitignore # git での管理を除外するファイルを指定する
│ ├── vendor # composer require でインストールされたファイル群
│ │ ├── autoload.php
│ │ └── vlucas
│ │ └── phpdotenv
.env
を以下のようkey=value
の形式で記述します。
DB_HOST=db_host_name
DB_NAME=db_name
DB_USER=user_name
DB_PASS=user_password
また、詳しい説明は割愛しますが.gitignore
のファイル内で.env
を指定して git での管理から除外し、間違って GitHub で公開されないように注意しましょう。
PHP で.env ファイルを読み込む
index.php
では以下のように記述します。
# Composerによって作成されるファイル
require __DIR__ . '/vendor/autoload.php';
# Dotenvを読み込み
$dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
$dotenv->load();
# .env ファイルの内容を取得する
$db_host = $_ENV['DB_HOST'];
$db_name = $_ENV['DB_NAME'];
$db_user = $_ENV['DB_USER'];
$db_pass = $_ENV['DB_PASS'];
# 定数にして使い回す場合
define('DB_HOST', $db_host);
define('DB_NAME', $db_name);
define('DB_USER', $db_user);
define('DB_PASS', $db_pass);
/vendor/autoload.php
は Composer によって生成されるファイルで、PHP のオートローディング(自動読み込み)機能を実装します。
これにより、必要なクラスが自動的に読み込まれ、明示的に各クラスファイルを require
または include
する必要がなくなります。
つまり、PHP dotenv やその他のライブラリを使用している場合、これらのライブラリのクラスを利用する前に/vendor/autoload.php
を require
するだけで、必要なすべてのクラスが自動的に読み込まれます。
__DIR__
は、実行しているindex.php
までのファイルパスを出力してくれます。
getenv メソッドの使い方
getenv
メソッドの使い方に関して、公式ドキュメントで以下のように記述されていました。
Using getenv() and putenv() is strongly discouraged due to the fact that these functions are not thread safe, however it is still possible to instruct PHP dotenv to use these functions. Instead of calling Dotenv::createImmutable, one can call Dotenv::createUnsafeImmutable, which will add the PutenvAdapter behind the scenes. Your environment variables will now be available using the getenv method, as well as the super-globals:
以下日本語訳
getenv()や putenv()の使用は強く推奨されていません。なぜなら、これらの関数はスレッドセーフ(並行実行安全)ではないからです。それでも、これらの関数を使用するように PHP dotenv に指示することは可能です。Dotenv::createImmutable の代わりに、Dotenv::createUnsafeImmutable を呼び出すことができます。これにより、裏側で PutenvAdapter が追加されます。これにより、getenv メソッドとスーパーグローバルの両方を使用して、環境変数を利用できます。
getenv
メソッドを使用する場合はDotenv::createImmutable
をDotenv::createUnsafeImmutable
に修正します。
# Composerによって作成されるファイル
require __DIR__ . '/vendor/autoload.php';
# Dotenvを読み込み
- $dotenv = Dotenv\Dotenv::createImmutable(__DIR__);
+ $dotenv = Dotenv\Dotenv::createUnsafeImmutable(__DIR__);
$dotenv->load();
- $db_host = $_ENV['DB_HOST'];
+ $db_host = getenv('DB_HOST');
- $db_name = $_ENV['DB_NAME'];
+ $db_name = getenv('DB_NAME');
- $db_user = $_ENV['DB_USER'];
+ $db_user = getenv('DB_USER');
- $db_pass = $_ENV['DB_PASS'];
+ $db_pass = getenv('DB_PASS');