이 퀵스타트를 사용해 PHP 드라이버를 설치하고, Microsoft Entra 아이덴티티로 Azure SQL에 연결한 뒤, 샘플 데이터에 대해 AdventureWorksLT 매개변수화된 Transact-SQL(T-SQL) 쿼리를 실행하세요. SQLSRV 절차적 API 또는 PDO_SQLSRV API 중 하나를 선택하세요. 두 샘플 모두 환경 변수에서 연결 설정을 읽고 동일한 결과를 반환합니다.
쿼리는 제품 데이터를 읽고 데이터베이스 객체를 생성하지 않습니다.
시작하기 전에
- 샘플 데이터를 포함하는
AdventureWorksLT데이터베이스를 생성하거나 연결하세요. Azure SQL Database, Microsoft Fabric의 SQL 데이터베이스, SQL Server, SQL Server 컨테이너의 설정 지침은 AdventureWorks 샘플 데이터베이스를 참조하세요. - 데이터베이스 관리자에게 Microsoft Entra 신원용 데이터베이스 사용자를 만들어 달라고 요청하세요.
- Windows에서는 데이터베이스 접근 권한이 있는 Windows 계정으로 로그인하세요.
- macOS나 Linux에서는 연합된 Microsoft Entra 계정에 대한 Kerberos 티켓을 받아보세요. 요구사항에 대해서는 ODBC 드라이버와 함께 Microsoft Entra ID 사용법을 참조하세요.
1. PHP와 드라이버 설치
운영 체제를 선택합니다. 전체 명령 블록을 복사해서 지정된 터미널에 붙여넣고 실행하세요.
관리자 권한으로 PowerShell을 엽니다. 이 블록을 복사해서 실행하세요:
winget install --exact --id PHP.PHP.8.5 --source winget --accept-package-agreements --accept-source-agreements
winget install --exact --id Microsoft.msodbcsql.18 --source winget --accept-package-agreements --accept-source-agreements
$env:Path = [Environment]::GetEnvironmentVariable("Path", "Machine") + ";" +
[Environment]::GetEnvironmentVariable("Path", "User")
New-Item -ItemType Directory -Force C:\php-quickstart | Out-Null
Set-Location C:\php-quickstart
$phpDirectory = Split-Path (Get-Command php.exe -ErrorAction Stop).Source
$phpIni = Join-Path $phpDirectory "php.ini"
if (-not (Test-Path $phpIni)) {
Copy-Item (Join-Path $phpDirectory "php.ini-development") $phpIni
}
$configuration = [System.IO.File]::ReadAllText($phpIni)
$configuration = $configuration -replace '(?m)^\s*;\s*extension_dir\s*=\s*"ext"\s*$', 'extension_dir = "ext"'
$configuration = $configuration -replace '(?m)^\s*;\s*extension\s*=\s*openssl\s*$', 'extension=openssl'
$configuration = $configuration -replace '(?m)^\s*;\s*extension\s*=\s*zip\s*$', 'extension=zip'
[System.IO.File]::WriteAllText($phpIni, $configuration)
Invoke-WebRequest https://github.com/php/pie/releases/latest/download/pie.phar -OutFile pie.phar
php .\pie.phar install microsoft/sqlsrv
php .\pie.phar install microsoft/pdo_sqlsrv
php --version
php --ri sqlsrv
php --ri pdo_sqlsrv
마지막 세 명령어는 설치된 PHP 및 확장 버전을 표시합니다. 성공하면 관리자 창을 닫으세요.
두 명령 중 하나라도 php --ri 확장 프로그램이 없다고 보고하면, 계속하기 전에 설치 문제 해결 단계로 가세요.
2. 연결 정보 설정
사용 중인 운영 체제의 블록에서 <server> 및 <database>을 바꾸세요. 전체 블록을 복사해서 PHP를 실행할 터미널에서 실행하세요.
Set-Location C:\php-quickstart
$env:SQL_SERVER = "tcp:<server>.database.windows.net,1433"
$env:SQL_DATABASE = "<database>"
$env:SQL_AUTHENTICATION = "ActiveDirectoryIntegrated"
Important
두 샘플 모두 암호화를 가능하게 하고 서버 인증서를 검증합니다. 서버가 사설 인증 기관(CA)의 인증서를 사용한다면, 발급 루트 및 중간 CA 인증서를 클라이언트 운영 체제 신뢰 저장소에 설치하세요.
SQL_SERVER을(를) 인증서의 주체 대체 이름(Subject Alternative Name) 또는 공통 이름(Common Name)에 있는 이름으로 설정하세요. 그렇지 않으면 쿼리가 실행되기 전에 연결이 실패합니다. 자세한 내용은 '신뢰할 수 없는 인증서 체인'과 'SQL Server 암호화 구성'을 참조하세요.
TrustServerCertificate=true 서버 신원 검증을 우회합니다. 이 시스템은 프로덕션이나 공유 환경에 대한 신뢰 구성이 아니라 고립된 로컬 테스트 환경을 진단하는 데만 사용하십시오.
3. 샘플 생성 및 실행
하나의 PHP API를 선택하세요. 선택한 탭의 코드를 사용해 이름 붙인 파일을 만들고, 그 코드 후에 명령을 실행하세요.
다음 코드로 quickstart-sqlsrv.php를 만듭니다.
<?php
declare(strict_types=1);
$server = getenv('SQL_SERVER') ?: null;
$database = getenv('SQL_DATABASE') ?: null;
$authentication = getenv('SQL_AUTHENTICATION') ?: null;
if ($server === null || $database === null || $authentication === null) {
throw new RuntimeException('Set SQL_SERVER, SQL_DATABASE, and SQL_AUTHENTICATION.');
}
if (!in_array($authentication, ['SqlPassword', 'ActiveDirectoryIntegrated', 'ActiveDirectoryMsi'], true)) {
throw new RuntimeException(
'Set SQL_AUTHENTICATION to SqlPassword, ActiveDirectoryIntegrated, or ActiveDirectoryMsi.'
);
}
$user = null;
$password = null;
if ($authentication === 'SqlPassword') {
$user = getenv('SQL_USER') ?: null;
$password = getenv('SQL_PASSWORD') ?: null;
if ($user === null || $password === null) {
throw new RuntimeException('Set SQL_USER and SQL_PASSWORD for SqlPassword authentication.');
}
}
$options = [
'Database' => $database,
'Authentication' => $authentication,
'Driver' => 'ODBC Driver 18 for SQL Server',
'Encrypt' => true,
'TrustServerCertificate' => false,
];
if ($authentication === 'SqlPassword') {
$options['UID'] = $user;
$options['PWD'] = $password;
}
$connection = sqlsrv_connect($server, $options);
if ($connection === false) {
throw new RuntimeException(print_r(sqlsrv_errors(), true));
}
$sql = <<<'SQL'
SELECT TOP (5) ProductID, Name
FROM SalesLT.Product
WHERE ProductID > ?
ORDER BY ProductID;
SQL;
$parameters = [0];
$statement = sqlsrv_query($connection, $sql, $parameters);
if ($statement === false) {
$errors = sqlsrv_errors();
sqlsrv_close($connection);
throw new RuntimeException(print_r($errors, true));
}
$rows = [];
while (($row = sqlsrv_fetch_array($statement, SQLSRV_FETCH_ASSOC)) !== null) {
if ($row === false) {
$errors = sqlsrv_errors();
sqlsrv_free_stmt($statement);
sqlsrv_close($connection);
throw new RuntimeException(print_r($errors, true));
}
$rows[] = $row;
}
sqlsrv_free_stmt($statement);
sqlsrv_close($connection);
if (count($rows) !== 5) {
throw new RuntimeException('Unexpected query result.');
}
$previousProductId = 0;
foreach ($rows as $row) {
if ($row['ProductID'] <= $previousProductId || $row['Name'] === '') {
throw new RuntimeException('Unexpected query result.');
}
$previousProductId = $row['ProductID'];
}
printf("%-12s%s\n", 'Product ID', 'Name');
printf("%-12s%s\n", '----------', '----');
foreach ($rows as $row) {
printf("%-12d%s\n", $row['ProductID'], $row['Name']);
}
샘플을 실행합니다.
php quickstart-sqlsrv.php
4. 결과 검증
제품 행은 AdventureWorksLT 버전에 따라 다를 수 있습니다. 두 샘플 모두 다음과 같은 출력을 반환합니다:
Product ID Name
---------- ----
680 HL Road Frame - Black, 58
706 HL Road Frame - Red, 58
707 Sport-100 Helmet, Red
708 Sport-100 Helmet, Black
709 Mountain Bike Socks, M
각 샘플은 검색이 빈 이름이 아닌 이름과 오름차순 제품 ID를 가진 다섯 개의 제품을 반환했는지 확인한 후 행을 출력합니다. 그 후 진술서를 해제하고 연결을 종료합니다. 쿼리는 제거할 데이터베이스 객체나 데이터를 남기지 않습니다.
다른 인증 방법 사용
샘플들은 PHP 파일을 변경하지 않고도 관리 신원 및 SQL Server 인증도 지원합니다.
관리형 아이덴티티
Azure에서 호스팅된 애플리케이션의 경우, 관리 신원을 활성화하고 데이터베이스 사용자를 생성합니다. 애플리케이션의 구성에서 서버, 데이터베이스, 인증 모드를 설정하세요:
SQL_SERVER=tcp:<server>.database.windows.net,1433
SQL_DATABASE=<database>
SQL_AUTHENTICATION=ActiveDirectoryMsi
SQL_USER 또는 SQL_PASSWORD을(를) 설정하지 마세요.
Microsoft Fabric의 SQL 데이터베이스에 대해서는 Fabric 접근 제어를 통해 신원에 항목 읽기 권한을 부여합니다. SQL 분석 엔드포인트가 아니라 데이터베이스 항목의 SQL 연결 엔드포인트를 사용하세요. Fabric의 SQL 데이터베이스는 SQL 인증을 지원하지 않습니다.
SQL Server 인증
SQL Server 인증은 자신이 제어하는 SQL Server 인스턴스, 예를 들어 격리된 로컬 개발 컨테이너에만 사용하세요. 자격 증명은 애플리케이션 설정이나 비밀 저장소에 보관하세요. 소스 컨트롤에 커밋하지 마세요.
$env:SQL_SERVER = "tcp:<server>,1433"
$env:SQL_DATABASE = "<database>"
$env:SQL_AUTHENTICATION = "SqlPassword"
$env:SQL_USER = "<user_id>"
$env:SQL_PASSWORD = "<password>"
다른 Microsoft Entra 인증 방법에 대해서는 Microsoft Entra 인증을 이용한 Connect 항목을 참조하세요.
설치 문제 해결
설치 블록이 멈추거나 검증 명령이 실패할 때 이 검사를 사용하세요.
Get-Command php.exe
php --ini
php --ri sqlsrv
php --ri pdo_sqlsrv
Get-OdbcDriver -Name "ODBC Driver 18 for SQL Server"
php.exe에서 Get-Command을 찾을 수 없으면 모든 터미널을 닫고 새 PowerShell 창을 연 다음 검사를 다시 실행하세요.
php --ri 명령에서 확장이 없습니다라고 표시되면 C:\php-quickstart의 PIE 설치 명령을 다시 실행하세요.
연결에서 FA001를 보고하고 인증 옵션은 통합 보안과 함께 사용할 수 없다고 표시되면, ActiveDirectoryIntegrated이(가) 정확히 SQL_AUTHENTICATION인지 확인하세요. PHP 드라이버 버전을 실행 php --ri sqlsrvphp --ri pdo_sqlsrv 하거나 확인하고, 5.10.1 이전 드라이버라면 업데이트 하세요.
청소
샘플들은 진술을 공개하고 연결을 종료합니다. 데이터베이스 객체를 생성하거나 데이터를 영속성하지 않습니다.
연결 설정은 현재 터미널 세션에 적용됩니다. 끝나면 터미널을 닫아.
프로덕션 재시도, 타임아웃, 로깅, 페일오버 설정의 경우, 이 첫 실행 샘플을 연장하지 말고 프로덕션 베이스라인 을 사용하세요.