PHP dotenvの使用方法

PHP dotenvの使用方法

はじめに

今回の記事では、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でインストールされたバージョンを確認します。

"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の形式で記述します。

".env"
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では以下のように記述します。

"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.phprequire するだけで、必要なすべてのクラスが自動的に読み込まれます。

__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::createImmutableDotenv::createUnsafeImmutableに修正します。

"index.php"
# 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');