PHPプロジェクト開発では、通常、構成ファイルを管理するための多くのオプションがあります。 .ENVファイルは、現在の主流フレームワーク(Laravelなど)の広く使用されている方法の1つです。柔軟な構成と環境変数の動的読み取りをサポートしています。ただし、一部の開発者は、 .ENVファイルの代わりにPHP定数(定義)を使用できますか?この記事では、 get_defined_constants関数を使用して、パフォーマンス、セキュリティ、柔軟性などの点で2つの利点と短所を分析します。
.ENVファイルは通常、データベース接続情報、APIキーなどの環境関連の構成を保存するために使用されます。
APP_ENV=production
DB_HOST=127.0.0.1
DB_PORT=3306
PHPで定数を定義する方法は次のとおりです。
define('APP_ENV', 'production');
define('DB_HOST', '127.0.0.1');
define('DB_PORT', 3306);
get_defined_constants(true)を介してカスタム定数を含むすべての定義された定数を取得できます。
$constants = get_defined_constants(true);
print_r($constants['user']);
実行効率の観点から見ると、PHP定数はコンピレーション段階で処理され、実行時に.ENVファイルを解析するよりも速く読み取られます(特に各リクエストがリロードされている場合)。
define('START', microtime(true));
define('CONFIG_VALUE', 'example');
for ($i = 0; $i < 100000; $i++) {
$x = CONFIG_VALUE;
}
echo 'Time: ' . (microtime(true) - START);
対比:
define('START', microtime(true));
putenv('CONFIG_VALUE=example');
for ($i = 0; $i < 100000; $i++) {
$x = getenv('CONFIG_VALUE');
}
echo 'Time: ' . (microtime(true) - START);
実際の測定では、一定の読み取り値は大幅に高速です。
.ENVの利点は、その変動性です。異なる.ENVファイルは、コードを変更せずに異なる展開環境を介して設定できます。
対照的に、定義が定義されると(スクリプトが再ロードされない限り)定義が変更されることはできません。これは、構成を動的に調整する必要があるシナリオに友好的ではありません。
たとえば、 https://m66.net/api/に展開されたサービスでは、さまざまな環境でアクセスアドレスを構成する必要があります。 .envファイルはこれを行うのに非常に便利です。
API_URL=https://m66.net/api/
また、定数を使用する場合、アドレスを変更するたびに、コードを再展開または変更する必要があります。
define('API_URL', 'https://m66.net/api/');
.ENVファイルは、Webサーバーを介して外側に公開しないでください。適切に構成されている場合、その内容は外側に見えません。ただし、構成が不適切な場合、漏れのリスクがあります。
PHP定数はコードの一部であり、実行時にのみ存在し、ユーザーが直接アクセスすることはできません。コード自体に関する限り、定数はより安全です。
get_defined_constants(true)['user']を使用して、すべてのユーザー定義の定数を簡単に表示します。これはデバッグに最適です。
echo "<pre>";
print_r(get_defined_constants(true)['user']);
echo "</pre>";
ただし、 .ENVのコンテンツは追跡が容易ではなく、追加のツールまたはカプセル化を読む必要があります。
寸法 | .ENVファイル | 定数(定義) |
---|---|---|
パフォーマンス | 媒体(IO依存) | HIGH(コンピレーション中にロード) |
柔軟性 | 高(複数の環境に適しています) | 低(静的不変) |
安全 | サーバーの構成に依存します | 比較的安全です |
デバッグの利便性 | 一般(フレームワークに協力する必要がある) | strong(get_defined_constants) |
定数を使用して.ENVファイルを置き換えるかどうかは、プロジェクトの要件に依存します。
プロジェクト構造が単純で、展開環境が固定されている場合、定数を使用すると、パフォーマンスとセキュリティが向上します。
プロジェクトにマルチ環境の展開と動的な構成の読み込みが含まれる場合、 .ENVファイルは依然としてより合理的な選択肢です。
実際の開発では、2つを組み合わせて使用することをお勧めします。コードの少数のコア構成を一定の形式で固め、 .ENVファイルに変数または機密構成を保存して、パフォーマンス、セキュリティ、柔軟性を考慮します。