본문으로 바로가기

windows apm 환경에 sqlsrv 구성 추가하기

category 서버&시스템/Windows 2022. 8. 9. 14:06

PHP에서 MSSQL DB를 다루려면 freetds 또는 sqlsrv를 사용해야 한다.

PHP 5.3 버전부터 php_mssql.dll을 지원하지 않는다(mssql_query(), mssql_fetch_array() 등의 함수들).

 

Linux APM 환경에서 freetds를 추가하는 방법은 여기에 포스팅 했었고, 본 포스팅은 windows APM 구성에 sqlsrv를 추가한다.

 

본문에서 구성한 APM 정보(XAMPP로 설치)

  • Windows 10 64bit 
  • XAMPP 1.7.3
  • Apache 2.2.14
  • MySQL 5.1.41
  • PHP 5.3.1

sqlsrv 적용 방법 요약

네가지 단계로 간단하게 요약할 수 있다(적용 후에는 아파치 재시작).

  1. sqlsrv 드라이버 파일(dll) 두가지를 구한다.
  2. php.ini 파일을 열고 extension_dir 항목의 경로를 확인한다.
  3. dll 파일을 경로에 복사한다.
  4. php.ini 파일에 extension=파일명 형식으로 각각 라인 추가.

php.ini가 아래와 같은 형태가 될 것이다.

extension_dir = "C:\xampp\php\ext"
...(생략)...
extension=php_pdo_sqlsrv.dll
extension=php_sqlsrv.dll

 

환경에 맞는 sqlsrv 드라이버 파일(dll) 구하기

Microsoft Drivers for PHP for SQL Server가 필요하다(아래 두가지 파일). PHP 관점에서는 extension이다.

  • php_pdo_sqlsrv.dll
  • php_sqlsrv.dll

 

우선 dll과 PHP 버전을 맞춰야 한다. PHP 구버전의 경우만 일부 기재한다.

 

Microsoft Drivers for PHP for SQL Server Version Supported PHP Versions
3.2 PHP 5.6.4+ or
PHP 5.5.16+ or
PHP 5.4.32
3.1 PHP 5.5.16+ or
PHP 5.4.32
3.0 PHP 5.4.32 or
PHP 5.3.0
2.0 PHP 5.3.0 or
PHP 5.2.4 or
PHP 5.2.13

 

이 중에서도 웹 서버에 구성된 PHP의 컴파일러에 맞는 드라이버를 구해야 한다(VC6 또는 VC9)

  • php_sqlsrv_53_ts_vc6.dll 또는
  • php_sqlsrv_53_ts_vc9.dll

 

TS(Thread Safe, 대게 iis)인지 NTS(Non Thread Safe, 대체 apache)인지도 맞춰야 한다.

  • php_sqlsrv_53_ts.dll 또는
  • php_sqlsrv_53_nts.dll

 

PHP가 TS인지 NTS인지 확인하는 방법은 두가지가 있는데, 아래 기준 표에 환경을 대입해 보거나 phpinfo() 에서 Thread Safe 항목을 확인, enabled가 TS이다.

 

Windows Server IIS (ISAPI) TS
Windows Server IIS (CGI or FastCGI) NTS
Windows Server Apache TS
Linux Server Apache prefork NTS
Linux Server Apache worker,event TS
Linux Server Nginx (PHP-FPM FastCGI) NTS

 

아래 MS 공식 페이지에서 다운로드 받을 수 있다.

 

 

이렇게 다운로드한 dll 파일을 서버에 적용하자마자 정상 동작한다면 매우 기쁜 일이다.

아래와 같은 상황들도 발생할 수 있다.

 

구버전 dll 파일 구하기

php_sqlsrv_53_ts_vc6.dll, php_pdo_sqlsrv_53_ts_vc6.dll (ver. 2.0.1802.200) 이러한 구버전 파일을 구하기가 매우 힘들다.

한참을 뒤져봤지만 MS 공식 페이지에서 배포하고 있는것 같지 않다.

 

아래 사이트에서 얻을 수 있었다.

 

 

오류 처리 1.

Error Message

PHP Startup: pdo_sqlsrv: Unable to initialize module
Module compiled with build ID=API20090626,TS,VC9
PHP Compiled with build ID=API20090626,TS,VC6
These options need to match

 

또는

 

Error Message

PHP Startup: Unable to load dynamic library 'C:\xampp\php\ext\php_pdo_sqlsrv_7_nts_x64.dll' - %1은(는) 올바른 Win32 응용 프로그램이 아닙니다.

 

PHP와 호환되지 않는 드라이버(버전, Thread Safe, x86/x64 등)를 적용하려는 경우 발생하는 메시지이다.

본문의 위 내용을 참고해서 드라이버(dll) 파일을 적절한 것으로 다시 구한다.

 

오류 처리 2.

Error Message

This extension requires either the Microsoft SQL Server 2008 Native Client (SP1 or later) or the Microsoft SQL Server 2008 R2 Native Client ODBC Driver to communicate with SQL Server.
Neither of those ODBC Drivers are currently installed. Access the following URL to download the Microsoft SQL Server 2008 R2 Native Client ODBC driver for x86: http://go.microsoft.com/fwlink/?LinkId=163712
[Microsoft][ODBC 드라이버 관리자] 데이터 원본 이름이 없고 기본 드라이버를 지정하지 않았습니다.

 

MSSQL 서버에 접속 시도하는 PHP 페이지에서 발생할 수 있는 오류 메시지이다.

접속에는 성공하였지만 데이터를 읽어들이지 못했다는 뜻이고, ODBC driver가 해당 웹 서버에 존재하지 않기 때문에 발생한다.

 

Microsoft SQL Server 2008 Native Client ODBC driver 키워드로 검색된 아래 페이지에서 설치하여 해결하였다.

https://www.microsoft.com/en-us/download/details.aspx?id=57606

 

테스트 PHP 코드

<?php
$server = "serverName\sqlexpress";
$connectionInfo = array( "Database"=>"dbName", "UID"=>"username", "PWD"=>"password" );
$conn = sqlsrv_connect( $server, $connectionInfo );

$sql = "SELECT * FROM Table_1";
$params = array();
$options =  array( "Scrollable" => SQLSRV_CURSOR_KEYSET );
$stmt = sqlsrv_query( $conn, $sql , $params, $options );

$row_count = sqlsrv_num_rows( $stmt );
   
if ($row_count === false)
   echo "Error in retrieveing row count.";
else
   echo $row_count;
?>