.env
에서 getenv()
, $_ENV
및 $_SERVER
로 환경 변수를 자동으로 로드합니다.
코드에 민감한 자격 증명을 저장해서는 안 됩니다 . 환경에 구성을 저장하는 것은 Twelve-Factor 앱의 원칙 중 하나입니다. 데이터베이스 자격 증명이나 타사 서비스에 대한 자격 증명 등 배포 환경 간에 변경될 가능성이 있는 모든 항목은 코드에서 환경 변수로 추출되어야 합니다.
기본적으로 .env
파일은 .htaccess 파일이나 Apache/nginx 가상 호스트를 수정하지 않고도 애플리케이션에 필요한 사용자 정의 구성 변수를 로드하는 쉬운 방법입니다. 즉, 프로젝트 외부의 파일을 편집할 필요가 없으며 Apache, Nginx, CLI, PHP 내장 웹 서버 등 프로젝트 실행 방법에 관계없이 모든 환경 변수가 항상 설정됩니다. 환경 변수를 설정하는 방법은 여러분이 알고 있는 다른 모든 방법보다 훨씬 쉽고 마음에 드실 것입니다!
php_value
플래그를 추가하지 않음PHP dotenv는 원래 Ruby dotenv의 PHP 버전입니다.
Composer를 통해 설치가 매우 쉽습니다.
$ composer require vlucas/phpdotenv
또는 composer.json
파일에 직접 추가하세요.
우리는 의미론적 버전 관리를 따르는데, 이는 주요 릴리스 사이에 주요 변경 사항이 발생할 수 있음을 의미합니다. V2에서 V3으로, V3에서 V4로, V4에서 V5로 업그레이드 가이드가 여기에서 제공됩니다.
.env
파일에는 민감한 API 키와 비밀번호가 포함될 수 있으므로 일반적으로 버전 제어에서 제외됩니다. 별도의 .env.example
파일은 민감한 변수를 제외하고 정의된 모든 필수 환경 변수를 사용하여 생성됩니다. 이 변수는 자체 개발 환경을 위해 사용자가 제공하거나 다른 곳에서 프로젝트 공동 작업자에게 전달됩니다. 그런 다음 프로젝트 공동 작업자는 .env.example
파일을 로컬 .env
에 독립적으로 복사하고 필요한 경우 비밀 키를 채우거나 자체 값을 제공하여 모든 설정이 로컬 환경에 맞게 올바른지 확인합니다. 이 사용법에서는 공동 작업자가 커밋하지 않도록 .env
파일을 프로젝트의 .gitignore
파일에 추가해야 합니다. 이렇게 사용하면 민감한 비밀번호나 API 키가 버전 제어 기록에 남지 않으므로 보안 위반 위험이 줄어들고 생산 값을 모든 프로젝트 공동 작업자와 공유할 필요가 없습니다.
프로젝트 루트의 .env
파일에 애플리케이션 구성을 추가합니다. .env
파일이 .gitignore
에 추가되어 코드에서 체크인되지 않았는지 확인하세요.
S3_BUCKET= " dotenv "
SECRET_KEY= " souper_seekret_key "
이제 .env.example
이라는 파일을 생성하고 이를 프로젝트에 체크인하세요. 여기에는 설정해야 하는 ENV 변수가 있어야 하지만 값은 비어 있거나 더미 데이터로 채워져 있어야 합니다. 아이디어는 사람들에게 어떤 변수가 필요한지 알려주되 민감한 생산 가치를 제공하지 않는 것입니다.
S3_BUCKET= " devbucket "
SECRET_KEY= " abc123 "
그런 다음 다음을 사용하여 애플리케이션에서 .env
로드할 수 있습니다.
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> load ();
.env
파일이 없을 때 발생하는 예외를 억제하려면 다음을 수행할 수 있습니다.
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ );
$ dotenv -> safeLoad ();
.env
이외의 것을 사용하려는 경우 선택적으로 두 번째 매개변수로 파일 이름을 전달할 수 있습니다.
$ dotenv = Dotenv Dotenv :: createImmutable ( __DIR__ , ' myconfig ' );
$ dotenv -> load ();
이제 정의된 모든 변수를 $_ENV
및 $_SERVER
슈퍼 전역에서 사용할 수 있습니다.
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
getenv()
및 putenv()
사용하는 것은 이러한 함수가 스레드로부터 안전하지 않기 때문에 강력히 권장되지 않습니다. 그러나 PHP dotenv에 이러한 함수를 사용하도록 지시하는 것은 여전히 가능합니다. Dotenv::createImmutable
호출하는 대신 Dotenv::createUnsafeImmutable
호출하면 배후에 PutenvAdapter
가 추가됩니다. 이제 getenv
메서드와 슈퍼 전역을 사용하여 환경 변수를 사용할 수 있습니다.
$ s3_bucket = getenv ( ' S3_BUCKET ' );
$ s3_bucket = $ _ENV [ ' S3_BUCKET ' ];
$ s3_bucket = $ _SERVER [ ' S3_BUCKET ' ];
환경 변수를 다른 환경 변수 내에 중첩할 수 있어 반복을 줄이는 데 유용합니다.
이는 ${…}
에 기존 환경 변수를 래핑하여 수행됩니다. 예:
BASE_DIR= " /var/webroot/project-root "
CACHE_DIR= " ${BASE_DIR} /cache "
TMP_DIR= " ${BASE_DIR} /tmp "
불변성은 Dotenv가 기존 환경 변수를 덮어쓸 수 있는지 여부를 나타냅니다. Dotenv가 기존 환경 변수를 덮어쓰도록 하려면 createImmutable
대신 createMutable
사용하세요.
$ dotenv = Dotenv Dotenv :: createMutable ( __DIR__ );
$ dotenv -> load ();
뒤에서 이것은 불변성을 허용할지 여부를 "저장소"에 지시하고 있습니다. 기본적으로 리포지토리는 기본적으로 기존 값을 덮어쓸 수 있도록 구성됩니다. 이는 RepositoryBuilder
사용하여 "create" 메서드를 호출하여 보다 사용자 정의된 리포지토리를 생성하는 경우와 관련이 있습니다.
$ repository = Dotenv Repository RepositoryBuilder :: createWithNoAdapters ()
-> addAdapter ( Dotenv Repository Adapter EnvConstAdapter ::class)
-> addWriter ( Dotenv Repository Adapter PutenvAdapter ::class)
-> immutable ()
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
위의 예에서는 로드된 값을 $_ENV
및 putenv
에 쓰지만 환경 변수를 보간할 때는 $_ENV
에서만 읽습니다. 또한 파일을 로드하기 전에 이미 설정된 변수는 절대 대체되지 않습니다.
또 다른 예를 통해 허용 목록에 추가할 변수 세트를 지정할 수도 있습니다. 즉, 허용 목록의 변수만 로드됩니다.
$ repository = Dotenv Repository RepositoryBuilder :: createWithDefaultAdapters ()
-> allowList ([ ' FOO ' , ' BAR ' ])
-> make ();
$ dotenv = Dotenv Dotenv :: create ( $ repository , __DIR__ );
$ dotenv -> load ();
PHP dotenv에는 환경 변수 존재 여부를 적용하는 등의 유효성 검사 기능이 내장되어 있습니다. 이는 앱이 없으면 작동하지 않는 명시적인 필수 변수를 사람들에게 알리는 데 특히 유용합니다.
단일 문자열을 사용할 수 있습니다.
$ dotenv -> required ( ' DATABASE_DSN ' );
또는 문자열 배열:
$ dotenv -> required ([ ' DB_HOST ' , ' DB_NAME ' , ' DB_USER ' , ' DB_PASS ' ]);
ENV 변수가 누락된 경우 Dotenv는 다음과 같이 RuntimeException
을 발생시킵니다.
One or more environment variables failed assertions: DATABASE_DSN is missing
단순히 변수를 설정하도록 요구하는 것 외에도 변수가 비어 있지 않은지 확인해야 할 수도 있습니다.
$ dotenv -> required ( ' DATABASE_DSN ' )-> notEmpty ();
환경 변수가 비어 있으면 예외가 발생합니다.
One or more environment variables failed assertions: DATABASE_DSN is empty
변수가 정수 값인지 확인해야 할 수도 있습니다. 다음을 수행할 수 있습니다.
$ dotenv -> required ( ' FOO ' )-> isInteger ();
환경 변수가 정수가 아닌 경우 예외가 발생합니다.
One or more environment variables failed assertions: FOO is not an integer.
변수가 설정된 경우에만 유효성 검사 규칙을 적용하고 싶을 수도 있습니다. 우리는 이것도 지원합니다:
$ dotenv -> ifPresent ( ' FOO ' )-> isInteger ();
변수가 "true", "false", "On", "1", "Yes", "Off", "0" 및 "No"를 허용하는 부울 형식인지 확인해야 할 수도 있습니다. 다음을 수행할 수 있습니다.
$ dotenv -> required ( ' FOO ' )-> isBoolean ();
환경 변수가 부울이 아닌 경우 예외가 발생합니다.
One or more environment variables failed assertions: FOO is not a boolean.
마찬가지로 다음과 같이 작성할 수 있습니다.
$ dotenv -> ifPresent ( ' FOO ' )-> isBoolean ();
환경 변수가 되어야 하는 값 세트를 정의하는 것도 가능합니다. 이는 실제로 코드에서 소수의 옵션이나 드라이버만 지원하는 상황에서 특히 유용합니다.
$ dotenv -> required ( ' SESSION_STORE ' )-> allowedValues ([ ' Filesystem ' , ' Memcached ' ]);
환경 변수가 허용되는 값 목록에 없으면 비슷한 예외가 발생합니다.
One or more environment variables failed assertions: SESSION_STORE is not an allowed value.
환경 변수가 되어야 하는 정규식을 정의하는 것도 가능합니다.
$ dotenv -> required ( ' FOO ' )-> allowedRegexValues ( ' ([[:lower:]]{3}) ' );
#
문자를 사용하여 .env
파일에 주석을 달 수 있습니다. 예:
# this is a comment
VAR= " value " # comment
VAR=value # comment
때로는 문자열을 제공하여 파일을 구문 분석하고 중첩된 환경 변수를 해결하고 배열이 다시 반환되도록 하려는 경우가 있습니다. 이는 이미 가능하지만 약간 까다롭기 때문에 이를 수행하는 직접적인 방법을 제공했습니다.
// ['FOO' => 'Bar', 'BAZ' => 'Hello Bar']
Dotenv Dotenv :: parse ( " FOO=Bar n BAZ= " Hello $ {FOO} "" );
이는 다음과 정확히 동일합니다.
Dotenv Dotenv :: createArrayBacked ( __DIR__ )-> load ();
다만, 파일을 찾기 위한 디렉터리를 제공하는 대신 파일 내용을 직접 제공했습니다.
새로운 개발자가 코드베이스를 복제할 때 .env.example
파일을 .env
에 수동으로 복사하고 자신의 값을 입력하는(또는 프로젝트 동료로부터 중요한 값을 가져오는) 추가 일회성 단계를 수행하게 됩니다.
특정 서버 설정(공유 호스팅에서 가장 일반적으로 발견됨)에서 PHP는 $_ENV
또는 $_SERVER
와 같은 슈퍼 전역을 비활성화할 수 있습니다. 이러한 변수가 설정되지 않은 경우 php.ini
파일의 variables_order
검토하세요. php.net/manual/en/ini.core.php#ini.variables-order를 참조하세요.
이 패키지에서 보안 취약점을 발견한 경우 [email protected]으로 이메일을 보내주십시오. 모든 보안 취약점은 즉시 해결됩니다. 여기에서 전체 보안 정책을 볼 수 있습니다.
PHP dotenv는 BSD 3-Clause License에 따라 라이센스가 부여됩니다.
Tidelift 구독의 일부로 사용 가능
vlucas/phpdotenv
및 수천 개의 기타 패키지 관리자는 Tidelift와 협력하여 애플리케이션 구축에 사용하는 오픈 소스 종속성에 대한 상업적 지원 및 유지 관리를 제공하고 있습니다. 시간을 절약하고 위험을 줄이며 코드 상태를 개선하는 동시에 사용하는 정확한 종속성에 대한 비용을 관리자에게 지불합니다. 자세히 알아보세요.