PHP 응용 프로그램에서 여러 환경 관리 (개발, 준비, 생산)
최신 웹 개발에서 여러 환경 관리가 필수적이므로 응용 프로그램이 수명주기의 여러 단계에서 적절하게 작동하도록합니다. 이러한 환경 - Development , Staging 및 프로덕션 프로덕션 - 각각 특정 목적을 달성하며 해당 단계의 고유 한 요구를 충족시키기 위해 각각 다르게 구성되어야합니다. &&&]
예를 들어:
- Development : 개발자가 작동하는 환경, 일반적으로 더 많은 장황한 벌목 및 디버깅 도구를 사용하는 환경.
- Staging : 배포 전에 최종 테스트에 사용되는 생산 환경의 복제본, 일반적으로 생산을 반영하는 데이터와 함께.
- 프로덕션 : 최종 사용자가 응용 프로그램에 액세스하는 라이브 환경.
PHP의 여러 환경을 효과적으로 관리하는 키는 구성 관리입니다. 이 기사에서는 환경 별 구성을 처리하고 원활한 배포를 보장하며 일반적인 함정을 피하기위한 모범 사례를 살펴 보겠습니다.
1. 환경 별 구성
여러 환경 관리의 가장 중요한 측면 중 하나는 애플리케이션의 구성이 환경에 따라 달라지는 것입니다. 데이터베이스 연결, API 키, 오류보고 및 캐싱 동작과 같은 설정은 개발, 준비 및 생산간에 크게 다를 수 있습니다.
에이. 환경 변수 사용
환경 변수는 환경 별 구성을 관리하는 일반적이고 안전한 방법입니다. 각 환경 (개발, 준비, 생산)에 대해 다양한 변수를 설정하고 getenv () 또는 $ _env.
를 사용하여 PHP 응용 프로그램 내에서 액세스 할 수 있습니다.
예를 들어:
- . ENV 파일 :이 파일은 환경 변수를 사람이 읽을 수있는 형식으로 저장하는 데 사용할 수 있습니다. vlucas/phpdotenv 와 같은 라이브러리를 사용하여 이러한 변수를 PHP 응용 프로그램에로드 할 수 있습니다.
. Env :
app_env = 개발
db_host = localhost
db_user = 루트
db_password = rootpassword
APP_ENV=development
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=rootpassword
PHP 코드에서 :
와 같은 이러한 변수에 액세스 할 수 있습니다.
php
// .env 파일에서 환경 변수로드 (phpdotenv를 사용하는 경우)
$ dotenv = dotenv \ dotenv :: createimmutable (__ dir__);
$ dotenv-> load ();
// 환경 변수에 액세스합니다
$ env = getenv ( 'app_env');
$ dbhost = getenv ( 'db_host');
$ dbuser = getenv ( 'db_user');
$ dbpassword = getenv ( 'db_password');
에코 "현재 환경 : $ env";
?>
APP_ENV=development
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=rootpassword
비. 각 환경에 대한 구성 파일
더 큰 응용 프로그램에서는 각 환경마다 별도의 파일에 구성 설정을 저장하는 것이 일반적입니다. 예를 들어 :
와 같은 구성 파일이 포함 된 구성 디렉토리를 가질 수 있습니다.
config/dev.php -
config/staging.php -
config/prod.php -
각 파일에는 해당 환경에 특정한 설정이 포함됩니다. APP_ENV 환경 변수의 값에 따라 이러한 구성을 동적으로로드 할 수 있습니다.
예:
php
// config.php
$ env = getenv ( 'app_env')? : '생산'; // 설정되지 않은 경우 생산 기본값
스위치 ($ env) {
사례 '개발':
$ config = 요구 사항 'config/dev.php';
부서지다;
케이스 '준비':
$ config = 요구 사항 'config/staging.php';
부서지다;
사례 '생산':
$ config = 요구 사항 'config/prod.php';
부서지다;
기본:
새로운 예외를 던지십시오 ( '알 수없는 환경 :'. $ env);
}
// $ 구성 배열을 사용합니다
?>
APP_ENV=development
DB_HOST=localhost
DB_USER=root
DB_PASSWORD=rootpassword
기음. 데이터베이스 구성 처리
데이터베이스 구성은 일반적으로 환경마다 다릅니다. 개발중인 로컬 데이터베이스, 별도의 스테이징 데이터베이스 및 프로덕션 데이터베이스가있을 수 있습니다. 환경 변수에 이러한 세부 사항을 저장하면 코드베이스에서 분리하는 데 도움이됩니다.
php
// db.php
$ dbhost = getenv ( 'db_host');
$ dbuser = getenv ( 'db_user');
$ dbpassword = getenv ( 'db_password');
$ dbname = getenv ( 'db_name');
노력하다 {
$ pdo = new pdo ( "mysql : host = $ dbhost; dbname = $ dbname", $ dbuser, $ dbpassword);
// PDO 오류 모드를 예외로 설정합니다
$ pdo-> stattribute (pdo :: attr_errmode, pdo :: errmode_exception);
} catch (pdoexception $ e) {
Echo '연결 실패 :'. $ e-> getMessage ();
}
?>
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>
2. 오류보고 및 디버깅
다른 환경에는 다른 수준의 오류보고가 필요할 수 있습니다.
- Development : 디버깅을위한 세부 오류 메시지, 경고 및 로그를 원합니다.
- Staging : 일반적으로 오류가 중요하거나 오류를 기록하지만 사용자에게 표시하지 않는 경우에만 오류를 표시하려고합니다.
- 제작 : 제작의 최종 사용자에게 오류 메시지가 표시되어서는 안됩니다. 대신 sentry 또는 loggly . 와 같은 외부 서비스에 오류를 기록합니다.
에이. 환경에 따라 display_errors를 설정하십시오
환경을 확인하고 적절한 수준의 오류 처리를 설정하여 오류보고를 제어 할 수 있습니다.
php
$ env = getenv ( 'app_env')? : '생산';
if ($ env === 'Development') {
ini_set ( 'display_errors', 1);
error_reporting (e_all);
} elseif ($ env === 'Staging') {
ini_set ( 'display_errors', 0);
error_reporting (e_all);
} else {// 제작
ini_set ( 'display_errors', 0);
error_reporting (0); // 사용자에게 오류가 표시되지 않습니다
// 파일 또는 외부 서비스에 오류를 기록합니다.
ini_set ( 'log_errors', 1);
ini_set ( 'error_log', '/path/to/logs/php_errors.log');
}
?>
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>
3. 배포 및 버전 제어
배포 관리는 여러 환경 관리의 또 다른 중요한 측면입니다.
git , ci/cd 파이프 라인 와 같은 도구 및 배포 자동화가 프로세스를 간소화하는 데 도움이됩니다.
에이. git 분기 전략
다른 환경에서 코드를 관리하기 위해
git flow 또는 github flow 와 같은 분기 전략을 사용하는 것이 중요합니다.
- Development : 모든 새로운 기능과 버그 수정은 기능 분기에 추가되어 개발에 병합됩니다.
- 준비 : 스테이징 브랜치는 종종 출시 후보와 함께 생산 준비에 사용됩니다.
- 프로덕션 : 철저한 테스트 된 코드 만 메인 또는 마스터로 병합되어 생산에 배포됩니다.
비. 지속적인 통합 및 배포 (CI/CD)
jenkins
, github action , , gitlab ci 또는 circleci 와 같은 도구 해당 환경에 배포합니다. 이것은 인적 오류를 줄이고 환경 간의 일관성을 보장합니다.
여러 환경을위한 일반적인 CI/CD 파이프 라인은 다음과 같습니다.
- 코드가 스테이징 브랜치로 푸시됩니다 : 자동화 된 테스트가 실행됩니다.
- 테스트가 통과하는 경우 스테이징 환경에 배포됩니다.
- 코드는 프로덕션 브랜치 로 병합됩니다 : 배포 스크립트가 실행하여 라이브 환경으로 푸시됩니다.
4. 환경 별 서비스
API, 캐싱 메커니즘 및 파일 스토리지 시스템과 같은 일부 서비스는 환경마다 다를 수 있습니다. 제작에서는 파일 스토리지에
Amazon S3 와 같은 서비스를 사용할 수 있지만 개발 중에는 로컬 파일 시스템을 사용할 수 있습니다.
구성 파일 또는 환경 변수에서 환경에 따라 다른 서비스 구성을 정의하십시오. 예를 들어:
// 파일 스토리지 설정
if (getenv ( 'app_env') === 'production') {
정의 ( 'file_storage_path', 's3 : // my-bucket/files/');
} 또 다른 {
정의 ( 'file_storage_path', '/var/www/app/files/');
}
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
echo 'Connection failed: ' . $e->getMessage();
}
?>
5. 캐싱 및 성능 최적화
캐싱 전략 및 성능 최적화는 환경마다 다릅니다. 개발 중에는 더 빠른 피드백을 위해 캐싱을 비활성화 할 수 있지만, 생산에서는 성능 향상을 위해 공격적인 캐싱을 원할 것입니다.
당신은 세션 스토리지 또는 쿼리 캐싱을 위해
redis memcached 와 같은 도구를 사용하여 적절한 캐시 헤더를 설정하여이를 제어 할 수 있으며, 제작에서만 파일 또는 데이터 캐싱을 활성화합니다. ]]
6. 보안
다른 환경에서 보안 조치는 또한 다양해야합니다.
Development
: 개발 편의성을 위해 편안한 보안 설정이있을 수 있습니다 (예 : 크로스 오리핀 리소스 공유 허용). -
준비 및 생산
: HTTPS, 크로스 사이트 스크립팅 보호 및 SQL 주입 보호를 포함한 엄격한 보안 정책을 시행합니다. -
비밀 관리 도구 (예 :
Hashicorp Vault
또는
AWS 비밀 관리자 )를 사용하여 특히 제작 환경에서 민감한 키 및 자격 증명을 안전하게 관리 할 수 있습니다.
결론
PHP 응용 프로그램에서 여러 환경을 관리하는 것은 개발, 테스트 및 생산 중에 앱이 예상대로 동작하도록하는 데 중요합니다. 환경 별 구성을 분리하고, 오류보고를 제어하고, 버전 제어 및 CI/CD를 사용하고, 각 환경에 대한 캐싱 및 서비스를 조정하면 개발 프로세스를 간소화하고 단계 간의 원활한 전환을 보장 할 수 있습니다.
궁극적으로, 여러 환경을 관리하기위한 확실한 전략은 응용 프로그램의 수명주기 동안 높은 수준의 코드 품질, 안정성 및 보안을 유지하는 데 도움이됩니다.